THE FIFA TRANSFERMARKET PREDICTION NOTEBOOK
import sys
import re
_r = re.escape
def _re_replace(s : str, to_replace : dict):
for p, r in to_replace.items():
s = re.compile(p).sub(r, s)
return s
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_formats = ['svg']
mpl.rcParams['figure.dpi'] = 300
!{sys.executable} -m pip install --quiet pandas
import pandas as pd
!{sys.executable} -m pip install --quiet seaborn
import seaborn as sns
!{sys.executable} -m pip install --quiet statsmodels numpy
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.tools as smt
!{sys.executable} -m pip install --quiet numpy
import numpy as np
!{sys.executable} -m pip install --quiet sklearn
import sklearn as skl
!{sys.executable} -m pip install --quiet scikit-learn-intelex
import sklearnex as sklx
#sklx.patch_sklearn()
import sklearn.linear_model
import sklearn.tree
import sklearn.ensemble
import sklearn.model_selection
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error
Learning curve utility function from scikit-learn's API (stable) documentation.[8]
from sklearn.model_selection import learning_curve
def plot_learning_curve(
estimator,
title,
X,
y,
axes=None,
ylim=None,
cv=None,
n_jobs=None,
train_sizes=np.linspace(0.1, 1.0, 5),
):
"""
Generate 3 plots: the test and training learning curve, the training
samples vs fit times curve, the fit times vs score curve.
Parameters
----------
estimator : estimator instance
An estimator instance implementing `fit` and `predict` methods which
will be cloned for each validation.
title : str
Title for the chart.
X : array-like of shape (n_samples, n_features)
Training vector, where ``n_samples`` is the number of samples and
``n_features`` is the number of features.
y : array-like of shape (n_samples) or (n_samples, n_features)
Target relative to ``X`` for classification or regression;
None for unsupervised learning.
axes : array-like of shape (3,), default=None
Axes to use for plotting the curves.
ylim : tuple of shape (2,), default=None
Defines minimum and maximum y-values plotted, e.g. (ymin, ymax).
cv : int, cross-validation generator or an iterable, default=None
Determines the cross-validation splitting strategy.
Possible inputs for cv are:
- None, to use the default 5-fold cross-validation,
- integer, to specify the number of folds.
- :term:`CV splitter`,
- An iterable yielding (train, test) splits as arrays of indices.
For integer/None inputs, if ``y`` is binary or multiclass,
:class:`StratifiedKFold` used. If the estimator is not a classifier
or if ``y`` is neither binary nor multiclass, :class:`KFold` is used.
Refer :ref:`User Guide <cross_validation>` for the various
cross-validators that can be used here.
n_jobs : int or None, default=None
Number of jobs to run in parallel.
``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.
``-1`` means using all processors. See :term:`Glossary <n_jobs>`
for more details.
train_sizes : array-like of shape (n_ticks,)
Relative or absolute numbers of training examples that will be used to
generate the learning curve. If the ``dtype`` is float, it is regarded
as a fraction of the maximum size of the training set (that is
determined by the selected validation method), i.e. it has to be within
(0, 1]. Otherwise it is interpreted as absolute sizes of the training
sets. Note that for classification the number of samples usually have
to be big enough to contain at least one sample from each class.
(default: np.linspace(0.1, 1.0, 5))
"""
if axes is None:
_, axes = plt.subplots(1, 3, figsize=(20, 5))
axes[0].set_title(title)
if ylim is not None:
axes[0].set_ylim(*ylim)
axes[0].set_xlabel("Training examples")
axes[0].set_ylabel("Score")
train_sizes, train_scores, test_scores, fit_times, _ = learning_curve(
estimator,
X,
y,
cv=cv,
n_jobs=n_jobs,
train_sizes=train_sizes,
return_times=True,
)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
fit_times_mean = np.mean(fit_times, axis=1)
fit_times_std = np.std(fit_times, axis=1)
# Plot learning curve
axes[0].grid()
axes[0].fill_between(
train_sizes,
train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std,
alpha=0.1,
color="r",
)
axes[0].fill_between(
train_sizes,
test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std,
alpha=0.1,
color="g",
)
axes[0].plot(
train_sizes, train_scores_mean, "o-", color="r", label="Training score"
)
axes[0].plot(
train_sizes, test_scores_mean, "o-", color="g", label="Cross-validation score"
)
axes[0].legend(loc="best")
# Plot n_samples vs fit_times
axes[1].grid()
axes[1].plot(train_sizes, fit_times_mean, "o-")
axes[1].fill_between(
train_sizes,
fit_times_mean - fit_times_std,
fit_times_mean + fit_times_std,
alpha=0.1,
)
axes[1].set_xlabel("Training examples")
axes[1].set_ylabel("fit_times")
axes[1].set_title("Scalability of the model")
# Plot fit_time vs score
fit_time_argsort = fit_times_mean.argsort()
fit_time_sorted = fit_times_mean[fit_time_argsort]
test_scores_mean_sorted = test_scores_mean[fit_time_argsort]
test_scores_std_sorted = test_scores_std[fit_time_argsort]
axes[2].grid()
axes[2].plot(fit_time_sorted, test_scores_mean_sorted, "o-")
axes[2].fill_between(
fit_time_sorted,
test_scores_mean_sorted - test_scores_std_sorted,
test_scores_mean_sorted + test_scores_std_sorted,
alpha=0.1,
)
axes[2].set_xlabel("fit_times")
axes[2].set_ylabel("Score")
axes[2].set_title("Performance of the model")
return plt
Association Football (or soccer) is a worldwide sport played by over 250 million players in over 250 countries[1]. In fact, football is the world’s sport, and the most popular across the globe in terms of fans as well. Football has a huge transfer market in which players are transferred across teams for up to hundreds of millions of euros. To put the amount of money that circulates in the global football market into perspective, squad values of top teams like Manchester United surpass billions of euros[2]. The market value of a player accounts for a huge role in how teams conduct their business in regards to transfers. Our goal is to help these clubs make the right investments in players they want to obtain, especially when spending huge amounts of money. More specifically, we want to accurately predict the market value of players so that clubs aren’t overpaying, or underselling their valued players. Plenty of factors play a role in determining the market value of a player. The most important factors include age, performance for club and national team (measured in stats such as goals, assists, tackles etc.) for a player in that position, experience (measured by number of seasons in top leagues), marketing value (measured by social media presence), and injury vulnerability[2].
The global football transfer market involves the circulation of billions of euros. Many top European clubs have spent hundreds of millions of dollars to bolster their respective teams. For example teams like Manchester United, Manchester City, and PSG have spent almost billions of euros to sign players to help their teams’ success in their respective leagues and on the European stage[6]. There is no doubt that decisions involving huge sums of such money should be carefully analyzed so that clubs can maximize success in both the business side as well as the performance side of their respective clubs. Transfermarkt is an online platform for transfers, market values, rumors, and stats. The business model consists of, in addition to sports journalistic reporting, the profiles of the players and discussion forums on the performance and market values of individual soccer players, teams and leagues[4]. Frequently being discussed in sports science and sports economics literature over the past few years, the so-called "market values" („Marktwerte“) have s to become the center of media attentioMultipleous studies have shown positive correlations between the predicted market values on Transfermarkt and the actual player income.’It’s reportedly known that players who are in contract negotiations would sometimes refer to Transfermarkt values as baselines for their salary expectations[4]. The “market values” can also be used as a measure of marketability; a higher marketability helps a player secure partnerships through sponsorship contracts. The age and performance statistics on Transfermarkt are also particularly useful in that player observers can identify young players and predict the development opportunities[4].
The open forums of Transfermarkt allow users to discuss and predict individual players’ market values and performance. Previous studies on collective intelligence[2] have used OLS regression models to evaluate the accuracy of predictions. It is shown that “forecasts of international soccer results based on the crowd’s valuations are more accurate than those based on standard predictors.”[3] This reveals a potential possibility that distributed intelligence is a contributing factor to the accuracy of predictions. We want to know if supervised machine learning algorithms, as another form of distributed intelligence, can make accurate predictions just as humans do. More particularly, we want to use machine learning models like OLS to predict market value of players across the football world.
Given the considerable number of players in football across the globe, it can get tedious to know which players have potential and are worth investing in. Do they have high performance for a player in their position? Are they playing for a renowned club or in a renowned league? Is their behavior respectable and are they marketable? These are the kinds of questions top clubs use when considering paying the big bucks for players. The problem we are trying to tackle is predicting the market value of players (in euros) using stats that are important when investing in a player such as goals, assists, and marketability.
The dataset[7] is composed of 7 different subsets, we will be using 4 of the datasets. Since each feature resides in different sets.
Appearances.csv
Clubs.csv
Competitions.csv
Games.csv
Leagues.csv
Player_valuations.csv
Players.csv
What an observation consists of: We are trying to use the variables we assume to be the most important and independent from each other. We decided on
What some critical variables are, how they are represented: We want variables which have the highest co-variance with each other. The metric should handle most features as unique features.
Any special handling, transformations, cleaning, etc will be needed: There will be club names, and probably inferences in our data. Such as Media Presence or Potential, these are metrics which can be objective to the person. How popular is the player that we are analyzing?
We are still going to be in search of more databases that might have different descriptive data that we might like to see how organizations search for talent. We can use what they might describe as their most sought out characteristics.
For simplicity we can also assume that all players have no contracts for their evaluation and are based solely on performance and the other variables mentioned.
_data_ = {
name: pd.read_csv(
file,
engine = 'c',
low_memory = True,
memory_map = False, # set `False` to load into memory
**kwargs
) for name, file, kwargs in [
('appearances', 'data/appearances.csv', {
'dtype': {
'player_id': 'object',
'game_id': 'object',
'appearance_id': 'object',
'competition_id': 'object',
'player_club_id': 'object'
}
}),
('clubs', 'data/clubs.csv', {
'dtype': {
'club_id': 'object'
}
}),
#('competitions', 'data/competitions.csv', {}),
('games', 'data/games.csv', {
'dtype': {
'game_id': 'object'
}
}),
#('leagues', 'data/leagues.csv', {}),
('players', 'data/players.csv', {
'parse_dates': ['date_of_birth'],
'dtype': {
'player_id': 'object',
'country_of_birth': 'category',
'country_of_citizenship': 'category',
'position': 'category',
'sub_position': 'category'
}
}),
('player_valuations', 'data/player_valuations.csv', {
'parse_dates': ['date'],
'dtype': {
'player_id': 'object'
}
})
]
}
data = {}
# clubs
data['clubs'] = _data_['clubs'].copy()
data['clubs'] = data['clubs'][[
'club_id',
'pretty_name'
]]
data['clubs'].rename(
columns = {'pretty_name': 'club_name'},
inplace = True
)
data['clubs'].set_index('club_id', inplace = True)
data['clubs']
| club_name | |
|---|---|
| club_id | |
| 1032 | Fc Reading |
| 2323 | Orduspor |
| 1387 | Acn Siena 1904 |
| 3592 | Kryvbas Kryvyi Rig |
| 1071 | Wigan Athletic |
| ... | ... |
| 1269 | Pec Zwolle |
| 200 | Fc Utrecht |
| 317 | Fc Twente Enschede |
| 3948 | Royale Union Saint Gilloise |
| 1304 | Heracles Almelo |
801 rows × 1 columns
# games
data['games'] = _data_['games'].copy()
data['games'] = data['games'][[
'season',
'game_id'
]]
data['games'].set_index('game_id', inplace = True)
data['games']
| season | |
|---|---|
| game_id | |
| 2244388 | 2012 |
| 2219794 | 2011 |
| 2244389 | 2012 |
| 2271112 | 2012 |
| 2229332 | 2012 |
| ... | ... |
| 3646190 | 2021 |
| 3646188 | 2021 |
| 3655616 | 2021 |
| 3655629 | 2021 |
| 3646191 | 2021 |
56028 rows × 1 columns
# appearances
data['appearances'] = _data_['appearances'].copy()
data['appearances'] = data['appearances'].loc[
:, ~data['appearances'].columns.isin([
'appearance_id',
'competition_id'
])
]
data['appearances'].rename(
columns = {'player_club_id': 'club_id'},
inplace = True
)
data['appearances'] = (
data['appearances']
.merge(
data['games'],
on = 'game_id',
copy = False
).drop(columns = 'game_id')
.merge(
data['clubs'],
on = 'club_id',
copy = False
).drop(columns = 'club_id')
)
data['appearances'] = (
data['appearances']
.groupby(['player_id', 'season'])
.agg({
**{
c: 'sum' for c in [
'goals',
'assists',
'minutes_played',
'yellow_cards',
'red_cards'
]
},
'club_name': 'last'
})
.reset_index('season')
)
data['appearances']
| season | goals | assists | minutes_played | yellow_cards | red_cards | club_name | |
|---|---|---|---|---|---|---|---|
| player_id | |||||||
| 10 | 2014 | 32 | 18 | 4578 | 12 | 0 | Lazio Rom |
| 10 | 2015 | 16 | 14 | 3428 | 6 | 0 | Lazio Rom |
| 100009 | 2014 | 0 | 0 | 5576 | 8 | 0 | Kuban Krasnodar |
| 100009 | 2015 | 2 | 2 | 4512 | 12 | 0 | Kuban Krasnodar |
| 100009 | 2016 | 0 | 0 | 1260 | 6 | 0 | Anzhi Makhachkala |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 99923 | 2014 | 0 | 2 | 832 | 4 | 0 | Cagliari Calcio |
| 99924 | 2016 | 0 | 2 | 1824 | 6 | 0 | Ca Osasuna |
| 99977 | 2014 | 0 | 0 | 194 | 0 | 0 | Rcd Mallorca |
| 99977 | 2015 | 10 | 6 | 3046 | 2 | 0 | Royal Excel Mouscron |
| 99977 | 2019 | 0 | 0 | 716 | 0 | 0 | Caykur Rizespor |
54216 rows × 7 columns
# player valuations
data['player_valuations'] = _data_['player_valuations'].copy()
data['player_valuations']['season'] = (
pd.DatetimeIndex(data['player_valuations']['date']).year
)
data['player_valuations'].drop(columns = 'date', inplace = True)
data['player_valuations'] = (
data['player_valuations']
.groupby(['player_id', 'season'])
.agg({'market_value': 'mean'})
.reset_index('season')
)
data['player_valuations'].rename(
columns = {'market_value_in_gbp': 'market_value'},
inplace = True
)
data['player_valuations']
| season | market_value | |
|---|---|---|
| player_id | ||
| 10 | 2004 | 6300000.0 |
| 10 | 2005 | 10800000.0 |
| 10 | 2006 | 22500000.0 |
| 10 | 2007 | 20700000.0 |
| 10 | 2008 | 18000000.0 |
| ... | ... | ... |
| 99977 | 2018 | 990000.0 |
| 99977 | 2019 | 720000.0 |
| 99977 | 2020 | 562500.0 |
| 99977 | 2021 | 495000.0 |
| 99977 | 2022 | 540000.0 |
181182 rows × 2 columns
# players
data['players'] = _data_['players'].copy()
data['players'] = data['players'].loc[
:, ~data['players'].columns.isin([
'last_season',
'name',
'current_club_id',
'market_value_in_gbp',
'highest_market_value_in_gbp',
'country_of_birth',
'url',
'foot'
])
]
data['players'].rename(
columns = {
'pretty_name': 'name',
'height_in_cm': 'height',
'country_of_citizenship': 'nationality'
},
inplace = True
)
data['players']['sub_position'] = (
data['players']['sub_position'].cat
.rename_categories(
lambda s: (
_re_replace(s, {
fr'''^(.*){_r(' - ')}(.*)$''': r'\2'
})
.title()
)
)
)
data['players'].set_index('player_id', inplace = True)
data['players']
| name | nationality | date_of_birth | position | sub_position | height | |
|---|---|---|---|---|---|---|
| player_id | ||||||
| 254016 | Arthur Delalande | France | 1992-05-18 | Midfield | Central Midfield | 186 |
| 51053 | Daniel Davari | Iran | 1988-01-06 | Goalkeeper | Goalkeeper | 192 |
| 31451 | Torsten Oehrl | Germany | 1986-01-07 | Attack | Centre-Forward | 192 |
| 44622 | Vladimir Kisenkov | Russia | 1981-10-08 | Defender | Right-Back | 182 |
| 30802 | Oscar Diaz | Spain | 1984-04-24 | Attack | Centre-Forward | 183 |
| ... | ... | ... | ... | ... | ... | ... |
| 462285 | Fabian De Keijzer | Netherlands | 2000-05-10 | Goalkeeper | Goalkeeper | 193 |
| 368612 | Merveille Bokadi | DR Congo | 1996-05-21 | Defender | Centre-Back | 186 |
| 408574 | Joey Veerman | Netherlands | 1998-11-19 | Midfield | Central Midfield | 185 |
| 364245 | Jordan Teze | Netherlands | 1999-09-30 | Defender | Centre-Back | 183 |
| 575367 | Richard Ledezma | United States | 2000-09-06 | Attack | Attacking Midfield | 174 |
23682 rows × 6 columns
# final dataset
data['all'] = data['players'].merge(
data['player_valuations'].merge(
data['appearances'],
on = ['player_id', 'season'],
copy = False
),
on = 'player_id',
copy = False
)
data['all']['age'] = (
pd.to_datetime(data['all']['season'], format = '%Y', utc = True)
- pd.to_datetime(data['all']['date_of_birth'], utc = True)
).astype('timedelta64[Y]')
data['all'].drop(columns = 'date_of_birth', inplace = True)
data['all'].dropna(axis = 'index', inplace = True)
data['all'].drop(
data['all'][
(data['all']['market_value'] <= 0)
| (data['all']['height'] <= 0)
| (data['all']['age'] <= 0)
].index,
inplace = True
)
data['all']
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | ||||||||||||||
| 9800 | Artem Milevskyi | Ukraine | Attack | Centre-Forward | 189 | 2020 | 90000.0 | 0 | 0 | 720 | 6 | 0 | Fk Minaj | 34.0 |
| 43084 | Gaetano Berardi | Switzerland | Defender | Right-Back | 179 | 2020 | 360000.0 | 0 | 0 | 228 | 0 | 0 | Leeds United | 31.0 |
| 230826 | Gennaro Acampora | Italy | Midfield | Central Midfield | 174 | 2020 | 360000.0 | 2 | 4 | 1248 | 4 | 0 | Spezia Calcio | 25.0 |
| 198087 | Matteo Ricci | Italy | Midfield | Defensive Midfield | 176 | 2020 | 1530000.0 | 0 | 6 | 4880 | 10 | 0 | Spezia Calcio | 25.0 |
| 110689 | Deniz Mehmet | Turkey | Goalkeeper | Goalkeeper | 192 | 2020 | 68000.0 | 0 | 0 | 1080 | 0 | 0 | Dundee United Fc | 27.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2019 | 420000.0 | 0 | 0 | 360 | 0 | 0 | Psv Eindhoven | 19.0 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2020 | 1102500.0 | 0 | 2 | 7494 | 10 | 0 | Psv Eindhoven | 20.0 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2021 | 5400000.0 | 2 | 8 | 5260 | 12 | 0 | Psv Eindhoven | 21.0 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2020 | 658250.0 | 0 | 2 | 234 | 2 | 0 | Psv Eindhoven | 19.0 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2021 | 765000.0 | 2 | 0 | 88 | 0 | 0 | Psv Eindhoven | 20.0 |
50365 rows × 14 columns
data['all'][data['all'].isna().any(axis = 1)]
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id |
data['all'].dtypes
name object nationality category position category sub_position category height int64 season int64 market_value float64 goals int64 assists int64 minutes_played int64 yellow_cards int64 red_cards int64 club_name object age float64 dtype: object
data['all'].describe()
| height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | age | |
|---|---|---|---|---|---|---|---|---|---|
| count | 50365.000000 | 50365.000000 | 5.036500e+04 | 50365.000000 | 50365.000000 | 50365.000000 | 50365.000000 | 50365.000000 | 50365.000000 |
| mean | 182.287938 | 2017.381813 | 3.654199e+06 | 3.897151 | 2.964400 | 2816.958801 | 6.026645 | 0.143989 | 24.658791 |
| std | 6.616766 | 2.315522 | 8.302298e+06 | 7.367342 | 4.805991 | 2102.487008 | 6.100280 | 0.545081 | 4.357635 |
| min | 159.000000 | 2013.000000 | 9.000000e+03 | 0.000000 | 0.000000 | 2.000000 | 0.000000 | 0.000000 | 14.000000 |
| 25% | 178.000000 | 2015.000000 | 3.600000e+05 | 0.000000 | 0.000000 | 900.000000 | 2.000000 | 0.000000 | 21.000000 |
| 50% | 183.000000 | 2017.000000 | 9.000000e+05 | 2.000000 | 2.000000 | 2580.000000 | 4.000000 | 0.000000 | 24.000000 |
| 75% | 187.000000 | 2019.000000 | 3.150000e+06 | 4.000000 | 4.000000 | 4420.000000 | 10.000000 | 0.000000 | 28.000000 |
| max | 206.000000 | 2021.000000 | 1.800000e+08 | 122.000000 | 62.000000 | 10122.000000 | 46.000000 | 6.000000 | 42.000000 |
pd.DataFrame(data['all']['sub_position'].unique())
| 0 | |
|---|---|
| 0 | Centre-Forward |
| 1 | Right-Back |
| 2 | Central Midfield |
| 3 | Defensive Midfield |
| 4 | Goalkeeper |
| 5 | Centre-Back |
| 6 | Attacking Midfield |
| 7 | Right Winger |
| 8 | Left Winger |
| 9 | Left-Back |
| 10 | Left Midfield |
| 11 | Midfield |
| 12 | Second Striker |
| 13 | Right Midfield |
| 14 | Attack |
| 15 | Defender |
data['all'][data['all']['name'] == 'Cristiano Ronaldo']
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | ||||||||||||||
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2014 | 96000000.0 | 122 | 46 | 9282 | 12 | 2 | Real Madrid | 28.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2015 | 105000000.0 | 102 | 30 | 8586 | 6 | 0 | Real Madrid | 29.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2016 | 99000000.0 | 84 | 24 | 8252 | 10 | 0 | Real Madrid | 30.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2017 | 90000000.0 | 88 | 16 | 7356 | 10 | 0 | Real Madrid | 31.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2018 | 96000000.0 | 56 | 20 | 7292 | 8 | 2 | Juventus Turin | 32.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2019 | 74250000.0 | 70 | 14 | 7982 | 6 | 0 | Juventus Turin | 33.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2020 | 54000000.0 | 76 | 8 | 7682 | 10 | 0 | Juventus Turin | 34.0 |
| 8198 | Cristiano Ronaldo | Portugal | Attack | Centre-Forward | 187 | 2021 | 39000000.0 | 48 | 6 | 6202 | 20 | 0 | Juventus Turin | 35.0 |
data['all_eda'] = data['all'].copy()
data['all_eda']['log_market_value'] = np.log(data['all_eda']['market_value'])
Find player with the highest market value.
df_highest_market_value_players = data['all_eda'].nlargest(n = 1, columns = 'market_value')
df_highest_market_value_players
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | log_market_value | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | |||||||||||||||
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2019 | 180000000.0 | 48 | 24 | 4102 | 4 | 0 | Fc Paris Saint Germain | 20.0 | 19.008467 |
df_highest_market_value = data['all_eda'].loc[data['all_eda']['name'].isin(df_highest_market_value_players['name'])]
df_highest_market_value
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | log_market_value | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | |||||||||||||||
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2015 | 45000.0 | 2 | 4 | 646 | 2 | 0 | As Monaco | 16.0 | 10.714418 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2016 | 1518750.0 | 42 | 16 | 4216 | 4 | 0 | As Monaco | 17.0 | 14.233398 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2017 | 40500000.0 | 34 | 20 | 5658 | 6 | 0 | As Monaco | 18.0 | 17.516813 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2018 | 138600000.0 | 74 | 28 | 6060 | 14 | 2 | Fc Paris Saint Germain | 19.0 | 18.747103 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2019 | 180000000.0 | 48 | 24 | 4102 | 4 | 0 | Fc Paris Saint Germain | 20.0 | 19.008467 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2020 | 162000000.0 | 70 | 22 | 7166 | 12 | 0 | Fc Paris Saint Germain | 21.0 | 18.903107 |
| 342229 | Kylian Mbappe | France | Attack | Centre-Forward | 178 | 2021 | 144000000.0 | 62 | 50 | 7232 | 22 | 0 | Fc Paris Saint Germain | 22.0 | 18.785324 |
_ = sns.barplot(
data = df_highest_market_value,
x = 'season', y = 'market_value'
).set(
title = f'''{df_highest_market_value_players['name'].values}'s '''
'''Market Value Over the Years'''
)
plt.xticks(rotation = 45, ha = 'right', rotation_mode = 'anchor')
plt.show()
_, axs = plt.subplots(ncols = 2)
_ = sns.histplot(
ax = axs[0],
data = data['all_eda'].reset_index(),
x = 'market_value',
bins = 50
).set(title = 'Distribution of Market Values')
_ = sns.histplot(
ax = axs[1],
data = data['all_eda'].reset_index(),
x = 'log_market_value',
bins = 50
).set(title = 'Distribution of Log Market Values')
plt.tight_layout()
plt.show()
_ = sns.boxplot(data = data['all_eda'][[
'goals',
'assists',
'yellow_cards',
'red_cards'
]]).set(title = 'Distribution of Goals, Assists, Yellow/Red Cards')
_ = sns.histplot(
data = data['all_eda'].reset_index(), x = 'height',
bins = 50
).set(title = 'Distribution of Height')
Packages:
sklearn (scikit-learn)StatsModelSeabornstatsmodels.apiWe believe that we can take the characteristics football clubs may regard to be the most important in the dataset and use those features to evaluate players. Those can be our core information in order to use regression analysis. If able to determine a certain cluster for the data set depending on the position and attributes. We can compare the players in the data set with the new data. We will be using OLS (Ordinary Least Squares).
We have to start with the most important step which is data cleaning and EDA analysis in order to get more accurate results, Matrix transformation with the numpy library. In order to increase covariance with variables, we can use dimension reduction techniques. Next we can normalize the data sets in order to not get skewed by one particular feature. Dealing with values missing or if we need to have numeric values for non-numeric data (i.e popularity, health, position).
Our comparison of errors will be coming from the Transfermrket.com website as it is updated everyday to evaluate different players. We can get the player’s information to get a percent error or a total error for our evaluations. If we can, we will use the RMSE (Root mean square error) or Mean Absolute Values of our model prediction.
We will be using an OLS regression model and the evaluation techniques we are considering are RMSE and Euclidean distance. A possible evaluation metric we will use is RMSE or Mean Absolute Value of Errors. It is derived by calculating the difference between the estimated and actual value, square those results, then calculate the mean of those results. The formula for RMSE is
$$ \text{RMSE} = \sqrt{\frac{\sum_{i = 1}^{N}\left(\text{Predicted}_{i} - \text{Actual}_{i}\right)^{2}}{N}} $$We wanted to start by analyzing which data variables are important and correlate with each other using a heat map. The heat map will allow us to determine which are important to keep and also the pair plot will show the correlation between the variables.
corr = data['all_eda'].corr()
_ = sns.heatmap(corr,
cmap = 'seismic',
linewidth = 1, linecolor = 'white',
vmax = 1, vmin = -1,
mask = np.triu(np.ones_like(corr, dtype = bool)),
annot = True,
fmt = '0.2f'
)
_ = sns.pairplot(
data['all_eda'].sample(frac = .05).reset_index(),
plot_kws = {'rasterized': True}
)
After analyzing which variables we wanted to keep and how they relate to each other. Our first intial model would be a simple OLS which will only use numerical data. We want to see the difference in our model if its classifying only numerical data. Since we believe the categorical data present can be defined as subjective in the Soccer world.
model_ols = smf.ols(formula = '''
market_value ~
age + goals + assists + minutes_played
+ yellow_cards + red_cards
+ height + age
''', data = data['all_eda'])
fit = model_ols.fit()
pred = fit.predict()
fit.summary()
| Dep. Variable: | market_value | R-squared: | 0.220 |
|---|---|---|---|
| Model: | OLS | Adj. R-squared: | 0.219 |
| Method: | Least Squares | F-statistic: | 2023. |
| Date: | Fri, 10 Jun 2022 | Prob (F-statistic): | 0.00 |
| Time: | 18:50:46 | Log-Likelihood: | -8.6764e+05 |
| No. Observations: | 50365 | AIC: | 1.735e+06 |
| Df Residuals: | 50357 | BIC: | 1.735e+06 |
| Df Model: | 7 | ||
| Covariance Type: | nonrobust |
| coef | std err | t | P>|t| | [0.025 | 0.975] | |
|---|---|---|---|---|---|---|
| Intercept | -3.263e+06 | 9.5e+05 | -3.434 | 0.001 | -5.13e+06 | -1.4e+06 |
| age | -7.257e+04 | 7704.492 | -9.419 | 0.000 | -8.77e+04 | -5.75e+04 |
| goals | 2.387e+05 | 5594.966 | 42.664 | 0.000 | 2.28e+05 | 2.5e+05 |
| assists | 3.224e+05 | 9256.579 | 34.825 | 0.000 | 3.04e+05 | 3.41e+05 |
| minutes_played | 816.2531 | 23.146 | 35.265 | 0.000 | 770.886 | 861.620 |
| yellow_cards | -6.42e+04 | 6966.312 | -9.216 | 0.000 | -7.79e+04 | -5.05e+04 |
| red_cards | -8.313e+04 | 6.08e+04 | -1.368 | 0.171 | -2.02e+05 | 3.6e+04 |
| height | 2.699e+04 | 5171.108 | 5.219 | 0.000 | 1.69e+04 | 3.71e+04 |
| Omnibus: | 52944.353 | Durbin-Watson: | 0.637 |
|---|---|---|---|
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 5493249.031 |
| Skew: | 5.172 | Prob(JB): | 0.00 |
| Kurtosis: | 53.106 | Cond. No. | 1.02e+05 |
df_pred = data['all_eda'].assign(market_value_pred = pred)
df_pred
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | log_market_value | market_value_pred | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | ||||||||||||||||
| 9800 | Artem Milevskyi | Ukraine | Attack | Centre-Forward | 189 | 2020 | 90000.0 | 0 | 0 | 720 | 6 | 0 | Fk Minaj | 34.0 | 11.407565 | -4.263355e+05 |
| 43084 | Gaetano Berardi | Switzerland | Defender | Right-Back | 179 | 2020 | 360000.0 | 0 | 0 | 228 | 0 | 0 | Leeds United | 31.0 | 12.793859 | -4.949353e+05 |
| 230826 | Gennaro Acampora | Italy | Midfield | Central Midfield | 174 | 2020 | 360000.0 | 2 | 4 | 1248 | 4 | 0 | Spezia Calcio | 25.0 | 12.793859 | 2.148142e+06 |
| 198087 | Matteo Ricci | Italy | Midfield | Defensive Midfield | 176 | 2020 | 1530000.0 | 0 | 6 | 4880 | 10 | 0 | Spezia Calcio | 25.0 | 14.240778 | 4.948876e+06 |
| 110689 | Deniz Mehmet | Turkey | Goalkeeper | Goalkeeper | 192 | 2020 | 68000.0 | 0 | 0 | 1080 | 0 | 0 | Dundee United Fc | 27.0 | 11.127263 | 8.416451e+05 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2019 | 420000.0 | 0 | 0 | 360 | 0 | 0 | Psv Eindhoven | 19.0 | 12.948010 | 5.915728e+05 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2020 | 1102500.0 | 0 | 2 | 7494 | 10 | 0 | Psv Eindhoven | 20.0 | 13.913091 | 6.344888e+06 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2021 | 5400000.0 | 2 | 8 | 5260 | 12 | 0 | Psv Eindhoven | 21.0 | 15.501910 | 6.731971e+06 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2020 | 658250.0 | 0 | 2 | 234 | 2 | 0 | Psv Eindhoven | 19.0 | 13.397340 | 7.621394e+05 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2021 | 765000.0 | 2 | 0 | 88 | 0 | 0 | Psv Eindhoven | 20.0 | 13.547631 | 5.314819e+05 |
50365 rows × 16 columns
print('RMSE', smt.eval_measures.rmse(
df_pred['market_value'],
df_pred['market_value_pred']
))
RMSE 7334580.4334724955
Taking the Log of the market value was a way to incorportate a different way of showing an error metric. The log would keep the monotonocity of each variable
model_ols = smf.ols(formula = '''
log_market_value ~
age + goals + assists + minutes_played
+ yellow_cards + red_cards
+ height + age
''', data = data['all_eda'])
fit = model_ols.fit()
pred = fit.predict()
fit.summary()
| Dep. Variable: | log_market_value | R-squared: | 0.277 |
|---|---|---|---|
| Model: | OLS | Adj. R-squared: | 0.276 |
| Method: | Least Squares | F-statistic: | 2750. |
| Date: | Fri, 10 Jun 2022 | Prob (F-statistic): | 0.00 |
| Time: | 18:50:46 | Log-Likelihood: | -84026. |
| No. Observations: | 50365 | AIC: | 1.681e+05 |
| Df Residuals: | 50357 | BIC: | 1.681e+05 |
| Df Model: | 7 | ||
| Covariance Type: | nonrobust |
| coef | std err | t | P>|t| | [0.025 | 0.975] | |
|---|---|---|---|---|---|---|
| Intercept | 12.6996 | 0.166 | 76.389 | 0.000 | 12.374 | 13.025 |
| age | 0.0146 | 0.001 | 10.794 | 0.000 | 0.012 | 0.017 |
| goals | 0.0235 | 0.001 | 23.997 | 0.000 | 0.022 | 0.025 |
| assists | 0.0447 | 0.002 | 27.589 | 0.000 | 0.042 | 0.048 |
| minutes_played | 0.0003 | 4.05e-06 | 63.687 | 0.000 | 0.000 | 0.000 |
| yellow_cards | 8.021e-05 | 0.001 | 0.066 | 0.948 | -0.002 | 0.002 |
| red_cards | 0.0104 | 0.011 | 0.979 | 0.328 | -0.010 | 0.031 |
| height | -0.0005 | 0.001 | -0.553 | 0.580 | -0.002 | 0.001 |
| Omnibus: | 829.490 | Durbin-Watson: | 0.849 |
|---|---|---|---|
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 780.323 |
| Skew: | 0.267 | Prob(JB): | 3.59e-170 |
| Kurtosis: | 2.707 | Cond. No. | 1.02e+05 |
df_pred = data['all_eda'].assign(log_market_value_pred = pred)
df_pred[['log_market_value', 'log_market_value_pred']]
| log_market_value | log_market_value_pred | |
|---|---|---|
| player_id | ||
| 9800 | 11.407565 | 13.285919 |
| 43084 | 12.793859 | 13.119897 |
| 230826 | 12.793859 | 13.524196 |
| 198087 | 14.240778 | 14.502799 |
| 110689 | 11.127263 | 13.274930 |
| ... | ... | ... |
| 364245 | 12.948010 | 12.977332 |
| 364245 | 13.913091 | 14.922000 |
| 364245 | 15.501910 | 14.675605 |
| 575367 | 13.397340 | 13.038863 |
| 575367 | 13.547631 | 12.973216 |
50365 rows × 2 columns
print('RMSE', smt.eval_measures.rmse(
df_pred['log_market_value'],
df_pred['log_market_value_pred']
))
RMSE 1.283259436824852
Since our dataset contains categorical values, we want to perform again OLS but by including those values so we can compare the accuracy between categorical and non-categorical OLS.
model_ols = smf.ols(formula = '''
log_market_value ~
age + goals + assists + minutes_played
+ yellow_cards + red_cards
+ height + age
+ C(nationality) + C(position) + C(sub_position) + C(club_name)
''', data = data['all_eda'])
fit = model_ols.fit()
pred = fit.predict()
fit.summary()
| Dep. Variable: | log_market_value | R-squared: | 0.676 |
|---|---|---|---|
| Model: | OLS | Adj. R-squared: | 0.673 |
| Method: | Least Squares | F-statistic: | 183.1 |
| Date: | Fri, 10 Jun 2022 | Prob (F-statistic): | 0.00 |
| Time: | 18:51:57 | Log-Likelihood: | -63777. |
| No. Observations: | 50365 | AIC: | 1.287e+05 |
| Df Residuals: | 49796 | BIC: | 1.337e+05 |
| Df Model: | 568 | ||
| Covariance Type: | nonrobust |
| coef | std err | t | P>|t| | [0.025 | 0.975] | |
|---|---|---|---|---|---|---|
| Intercept | 11.5308 | 0.571 | 20.178 | 0.000 | 10.411 | 12.651 |
| C(nationality)[T.Albania] | 0.0734 | 0.622 | 0.118 | 0.906 | -1.146 | 1.292 |
| C(nationality)[T.Algeria] | 0.2551 | 0.621 | 0.411 | 0.681 | -0.962 | 1.472 |
| C(nationality)[T.Angola] | 0.3074 | 0.624 | 0.492 | 0.622 | -0.916 | 1.531 |
| C(nationality)[T.Antigua and Barbuda] | 0.2160 | 0.714 | 0.302 | 0.762 | -1.183 | 1.615 |
| C(nationality)[T.Argentina] | 0.2977 | 0.619 | 0.481 | 0.631 | -0.916 | 1.512 |
| C(nationality)[T.Armenia] | -0.0014 | 0.625 | -0.002 | 0.998 | -1.227 | 1.224 |
| C(nationality)[T.Aruba] | -0.0902 | 0.652 | -0.138 | 0.890 | -1.368 | 1.188 |
| C(nationality)[T.Australia] | 0.1675 | 0.622 | 0.269 | 0.788 | -1.052 | 1.387 |
| C(nationality)[T.Austria] | 0.2851 | 0.621 | 0.459 | 0.646 | -0.931 | 1.502 |
| C(nationality)[T.Azerbaijan] | -0.1142 | 0.643 | -0.178 | 0.859 | -1.374 | 1.146 |
| C(nationality)[T.Bahrain] | -1.712e-13 | 1.79e-14 | -9.562 | 0.000 | -2.06e-13 | -1.36e-13 |
| C(nationality)[T.Barbados] | -2.56e-13 | 1.83e-13 | -1.397 | 0.163 | -6.15e-13 | 1.03e-13 |
| C(nationality)[T.Belarus] | 0.0723 | 0.624 | 0.116 | 0.908 | -1.151 | 1.296 |
| C(nationality)[T.Belgium] | 0.1595 | 0.619 | 0.258 | 0.797 | -1.054 | 1.373 |
| C(nationality)[T.Benin] | -0.0629 | 0.633 | -0.099 | 0.921 | -1.304 | 1.178 |
| C(nationality)[T.Bermuda] | 0.8274 | 1.065 | 0.777 | 0.437 | -1.259 | 2.914 |
| C(nationality)[T.Bolivia] | 0.2710 | 0.665 | 0.408 | 0.683 | -1.032 | 1.574 |
| C(nationality)[T.Bosnia-Herzegovina] | 0.1339 | 0.621 | 0.216 | 0.829 | -1.083 | 1.351 |
| C(nationality)[T.Brazil] | 0.2422 | 0.619 | 0.391 | 0.696 | -0.971 | 1.456 |
| C(nationality)[T.Bulgaria] | 0.2262 | 0.626 | 0.362 | 0.718 | -1.000 | 1.452 |
| C(nationality)[T.Burkina Faso] | 0.2372 | 0.625 | 0.379 | 0.704 | -0.988 | 1.462 |
| C(nationality)[T.Burundi] | 0.2987 | 0.656 | 0.455 | 0.649 | -0.987 | 1.584 |
| C(nationality)[T.Cameroon] | 0.2567 | 0.620 | 0.414 | 0.679 | -0.959 | 1.473 |
| C(nationality)[T.Canada] | -0.0501 | 0.626 | -0.080 | 0.936 | -1.277 | 1.177 |
| C(nationality)[T.Cape Verde] | 0.1182 | 0.623 | 0.190 | 0.849 | -1.103 | 1.339 |
| C(nationality)[T.Central African Republic] | 0.4542 | 0.647 | 0.702 | 0.483 | -0.814 | 1.723 |
| C(nationality)[T.Chad] | 0.1665 | 0.665 | 0.251 | 0.802 | -1.136 | 1.469 |
| C(nationality)[T.Chile] | 0.2355 | 0.623 | 0.378 | 0.705 | -0.986 | 1.457 |
| C(nationality)[T.China] | -0.4146 | 0.656 | -0.632 | 0.527 | -1.700 | 0.871 |
| C(nationality)[T.Chinese Taipei (Taiwan)] | -0.7022 | 0.761 | -0.923 | 0.356 | -2.193 | 0.789 |
| C(nationality)[T.Colombia] | 0.4535 | 0.621 | 0.731 | 0.465 | -0.763 | 1.670 |
| C(nationality)[T.Comoros] | 0.3605 | 0.640 | 0.563 | 0.573 | -0.894 | 1.616 |
| C(nationality)[T.Congo] | 0.0272 | 0.627 | 0.043 | 0.965 | -1.201 | 1.256 |
| C(nationality)[T.Costa Rica] | 0.1420 | 0.626 | 0.227 | 0.821 | -1.085 | 1.369 |
| C(nationality)[T.Cote d'Ivoire] | 0.3630 | 0.620 | 0.586 | 0.558 | -0.852 | 1.578 |
| C(nationality)[T.Croatia] | 0.3909 | 0.620 | 0.631 | 0.528 | -0.824 | 1.606 |
| C(nationality)[T.Cuba] | -0.0319 | 1.066 | -0.030 | 0.976 | -2.122 | 2.058 |
| C(nationality)[T.Curacao] | -0.0264 | 0.626 | -0.042 | 0.966 | -1.253 | 1.200 |
| C(nationality)[T.Cyprus] | 0.2698 | 0.636 | 0.424 | 0.671 | -0.977 | 1.516 |
| C(nationality)[T.Czech Republic] | 0.2854 | 0.621 | 0.459 | 0.646 | -0.933 | 1.503 |
| C(nationality)[T.DR Congo] | 0.3310 | 0.621 | 0.533 | 0.594 | -0.886 | 1.548 |
| C(nationality)[T.Denmark] | 0.0994 | 0.619 | 0.161 | 0.872 | -1.114 | 1.313 |
| C(nationality)[T.Dominican Republic] | -0.0761 | 0.664 | -0.115 | 0.909 | -1.378 | 1.226 |
| C(nationality)[T.Ecuador] | 0.3856 | 0.627 | 0.615 | 0.538 | -0.843 | 1.614 |
| C(nationality)[T.Egypt] | 0.1933 | 0.627 | 0.309 | 0.758 | -1.035 | 1.421 |
| C(nationality)[T.El Salvador] | -0.4620 | 0.714 | -0.647 | 0.517 | -1.861 | 0.937 |
| C(nationality)[T.England] | -0.0234 | 0.619 | -0.038 | 0.970 | -1.237 | 1.190 |
| C(nationality)[T.Equatorial Guinea] | 0.2439 | 0.650 | 0.375 | 0.708 | -1.031 | 1.518 |
| C(nationality)[T.Eritrea] | 0.6184 | 0.871 | 0.710 | 0.478 | -1.088 | 2.325 |
| C(nationality)[T.Estonia] | -0.0223 | 0.647 | -0.034 | 0.973 | -1.291 | 1.246 |
| C(nationality)[T.Ethiopia] | -0.8931 | 1.065 | -0.839 | 0.402 | -2.980 | 1.194 |
| C(nationality)[T.Faroe Islands] | -0.2302 | 0.645 | -0.357 | 0.721 | -1.495 | 1.035 |
| C(nationality)[T.Finland] | -0.0048 | 0.623 | -0.008 | 0.994 | -1.226 | 1.217 |
| C(nationality)[T.France] | 0.2101 | 0.619 | 0.339 | 0.734 | -1.003 | 1.423 |
| C(nationality)[T.French Guiana] | -0.1230 | 0.654 | -0.188 | 0.851 | -1.405 | 1.159 |
| C(nationality)[T.Gabon] | 0.3419 | 0.627 | 0.545 | 0.586 | -0.887 | 1.571 |
| C(nationality)[T.Georgia] | 0.3288 | 0.622 | 0.528 | 0.597 | -0.891 | 1.549 |
| C(nationality)[T.Germany] | 0.0254 | 0.619 | 0.041 | 0.967 | -1.188 | 1.239 |
| C(nationality)[T.Ghana] | 0.2364 | 0.620 | 0.381 | 0.703 | -0.979 | 1.452 |
| C(nationality)[T.Greece] | 0.0321 | 0.619 | 0.052 | 0.959 | -1.182 | 1.246 |
| C(nationality)[T.Grenada] | -0.4418 | 0.731 | -0.604 | 0.546 | -1.875 | 0.991 |
| C(nationality)[T.Guadeloupe] | 0.3332 | 0.632 | 0.527 | 0.598 | -0.906 | 1.572 |
| C(nationality)[T.Guinea] | 0.2765 | 0.622 | 0.444 | 0.657 | -0.943 | 1.496 |
| C(nationality)[T.Guinea-Bissau] | 0.2285 | 0.624 | 0.366 | 0.714 | -0.995 | 1.452 |
| C(nationality)[T.Guyana] | 0.3912 | 0.713 | 0.549 | 0.583 | -1.006 | 1.789 |
| C(nationality)[T.Haiti] | 0.0722 | 0.635 | 0.114 | 0.910 | -1.172 | 1.317 |
| C(nationality)[T.Honduras] | 0.2149 | 0.639 | 0.336 | 0.737 | -1.037 | 1.467 |
| C(nationality)[T.Hungary] | 0.1792 | 0.625 | 0.287 | 0.774 | -1.047 | 1.405 |
| C(nationality)[T.Iceland] | 0.2630 | 0.622 | 0.423 | 0.673 | -0.957 | 1.483 |
| C(nationality)[T.India] | 1.52e-14 | 1.58e-13 | 0.096 | 0.923 | -2.95e-13 | 3.25e-13 |
| C(nationality)[T.Indonesia] | 0.9394 | 1.065 | 0.882 | 0.378 | -1.148 | 3.027 |
| C(nationality)[T.Iran] | 0.4490 | 0.625 | 0.718 | 0.473 | -0.777 | 1.675 |
| C(nationality)[T.Iraq] | 0.4089 | 0.642 | 0.637 | 0.524 | -0.849 | 1.667 |
| C(nationality)[T.Ireland] | -0.2672 | 0.621 | -0.430 | 0.667 | -1.485 | 0.950 |
| C(nationality)[T.Israel] | 0.0658 | 0.625 | 0.105 | 0.916 | -1.159 | 1.291 |
| C(nationality)[T.Italy] | -0.0848 | 0.619 | -0.137 | 0.891 | -1.299 | 1.129 |
| C(nationality)[T.Jamaica] | 0.0584 | 0.628 | 0.093 | 0.926 | -1.172 | 1.289 |
| C(nationality)[T.Japan] | 0.3798 | 0.621 | 0.611 | 0.541 | -0.838 | 1.598 |
| C(nationality)[T.Jordan] | 0.6676 | 0.758 | 0.881 | 0.378 | -0.817 | 2.152 |
| C(nationality)[T.Kazakhstan] | 0.3803 | 0.643 | 0.591 | 0.554 | -0.880 | 1.641 |
| C(nationality)[T.Kenya] | 0.1786 | 0.650 | 0.275 | 0.784 | -1.096 | 1.453 |
| C(nationality)[T.Korea, North] | -0.4534 | 1.064 | -0.426 | 0.670 | -2.540 | 1.633 |
| C(nationality)[T.Korea, South] | 0.3175 | 0.627 | 0.507 | 0.612 | -0.911 | 1.546 |
| C(nationality)[T.Kosovo] | 0.2897 | 0.625 | 0.464 | 0.643 | -0.934 | 1.514 |
| C(nationality)[T.Kyrgyzstan] | 0.4672 | 0.879 | 0.532 | 0.595 | -1.256 | 2.190 |
| C(nationality)[T.Laos] | 0.3392 | 0.797 | 0.425 | 0.671 | -1.223 | 1.902 |
| C(nationality)[T.Latvia] | 0.0957 | 0.661 | 0.145 | 0.885 | -1.200 | 1.392 |
| C(nationality)[T.Lebanon] | -0.4056 | 0.871 | -0.466 | 0.641 | -2.113 | 1.302 |
| C(nationality)[T.Liberia] | -0.0169 | 0.701 | -0.024 | 0.981 | -1.390 | 1.356 |
| C(nationality)[T.Libya] | 0.0077 | 0.677 | 0.011 | 0.991 | -1.320 | 1.336 |
| C(nationality)[T.Liechtenstein] | -0.1000 | 0.797 | -0.126 | 0.900 | -1.661 | 1.461 |
| C(nationality)[T.Lithuania] | -0.0717 | 0.636 | -0.113 | 0.910 | -1.318 | 1.175 |
| C(nationality)[T.Luxembourg] | -0.0356 | 0.633 | -0.056 | 0.955 | -1.275 | 1.204 |
| C(nationality)[T.Madagascar] | -0.2719 | 0.640 | -0.425 | 0.671 | -1.527 | 0.983 |
| C(nationality)[T.Malawi] | -2.121e-15 | 4.6e-15 | -0.461 | 0.645 | -1.11e-14 | 6.89e-15 |
| C(nationality)[T.Malaysia] | -0.1874 | 0.684 | -0.274 | 0.784 | -1.527 | 1.153 |
| C(nationality)[T.Mali] | 0.2339 | 0.621 | 0.377 | 0.706 | -0.983 | 1.451 |
| C(nationality)[T.Malta] | 0.0808 | 0.692 | 0.117 | 0.907 | -1.275 | 1.437 |
| C(nationality)[T.Martinique] | 0.2185 | 0.629 | 0.347 | 0.728 | -1.015 | 1.452 |
| C(nationality)[T.Mauritania] | -0.2784 | 0.639 | -0.436 | 0.663 | -1.530 | 0.974 |
| C(nationality)[T.Mauritius] | 0.5766 | 0.714 | 0.808 | 0.419 | -0.822 | 1.976 |
| C(nationality)[T.Mexico] | 0.6376 | 0.624 | 1.022 | 0.307 | -0.585 | 1.860 |
| C(nationality)[T.Moldova] | 0.0271 | 0.631 | 0.043 | 0.966 | -1.210 | 1.264 |
| C(nationality)[T.Monaco] | -3.298e-15 | 6.86e-15 | -0.481 | 0.631 | -1.67e-14 | 1.01e-14 |
| C(nationality)[T.Montenegro] | 0.1993 | 0.624 | 0.319 | 0.749 | -1.024 | 1.422 |
| C(nationality)[T.Montserrat] | -0.3876 | 0.756 | -0.513 | 0.608 | -1.868 | 1.093 |
| C(nationality)[T.Morocco] | 0.1712 | 0.620 | 0.276 | 0.782 | -1.044 | 1.386 |
| C(nationality)[T.Mozambique] | 0.0084 | 0.636 | 0.013 | 0.989 | -1.238 | 1.255 |
| C(nationality)[T.Netherlands] | 0.1139 | 0.619 | 0.184 | 0.854 | -1.099 | 1.327 |
| C(nationality)[T.Neukaledonien] | 0.3030 | 0.684 | 0.443 | 0.658 | -1.038 | 1.644 |
| C(nationality)[T.New Zealand] | 0.2472 | 0.636 | 0.389 | 0.698 | -0.999 | 1.494 |
| C(nationality)[T.Nicaragua] | 0.1831 | 1.065 | 0.172 | 0.863 | -1.904 | 2.270 |
| C(nationality)[T.Niger] | 0.1153 | 0.683 | 0.169 | 0.866 | -1.224 | 1.455 |
| C(nationality)[T.Nigeria] | 0.1771 | 0.620 | 0.286 | 0.775 | -1.038 | 1.392 |
| C(nationality)[T.North Macedonia] | 0.0168 | 0.626 | 0.027 | 0.979 | -1.211 | 1.244 |
| C(nationality)[T.Northern Ireland] | -0.2628 | 0.623 | -0.422 | 0.673 | -1.485 | 0.959 |
| C(nationality)[T.Norway] | 0.3063 | 0.621 | 0.494 | 0.622 | -0.910 | 1.523 |
| C(nationality)[T.Pakistan] | -0.3945 | 0.731 | -0.539 | 0.590 | -1.828 | 1.039 |
| C(nationality)[T.Palästina] | -0.3004 | 0.871 | -0.345 | 0.730 | -2.008 | 1.407 |
| C(nationality)[T.Panama] | -0.1438 | 0.668 | -0.215 | 0.830 | -1.453 | 1.165 |
| C(nationality)[T.Papua New Guinea] | 3.668e-15 | 2.15e-15 | 1.704 | 0.088 | -5.52e-16 | 7.89e-15 |
| C(nationality)[T.Paraguay] | 0.4662 | 0.625 | 0.746 | 0.456 | -0.759 | 1.692 |
| C(nationality)[T.Peru] | 0.3248 | 0.628 | 0.518 | 0.605 | -0.905 | 1.555 |
| C(nationality)[T.Philippines] | 0.2199 | 0.654 | 0.336 | 0.737 | -1.062 | 1.502 |
| C(nationality)[T.Poland] | 0.2336 | 0.620 | 0.377 | 0.707 | -0.983 | 1.450 |
| C(nationality)[T.Portugal] | 0.2908 | 0.619 | 0.470 | 0.639 | -0.923 | 1.504 |
| C(nationality)[T.Qatar] | 0.0410 | 0.732 | 0.056 | 0.955 | -1.394 | 1.476 |
| C(nationality)[T.Romania] | 0.4134 | 0.622 | 0.665 | 0.506 | -0.805 | 1.632 |
| C(nationality)[T.Russia] | -0.1759 | 0.619 | -0.284 | 0.776 | -1.390 | 1.038 |
| C(nationality)[T.Rwanda] | -0.1928 | 0.664 | -0.290 | 0.772 | -1.495 | 1.110 |
| C(nationality)[T.Saint-Martin] | -0.4561 | 0.875 | -0.521 | 0.602 | -2.170 | 1.258 |
| C(nationality)[T.San Marino] | -8.946e-16 | 2.83e-15 | -0.316 | 0.752 | -6.45e-15 | 4.66e-15 |
| C(nationality)[T.Sao Tome and Principe] | 0.4772 | 0.701 | 0.681 | 0.496 | -0.896 | 1.851 |
| C(nationality)[T.Saudi Arabia] | -0.0310 | 0.730 | -0.042 | 0.966 | -1.462 | 1.400 |
| C(nationality)[T.Scotland] | -0.0669 | 0.620 | -0.108 | 0.914 | -1.282 | 1.148 |
| C(nationality)[T.Senegal] | 0.3127 | 0.620 | 0.504 | 0.614 | -0.902 | 1.527 |
| C(nationality)[T.Serbia] | 0.2978 | 0.620 | 0.481 | 0.631 | -0.917 | 1.512 |
| C(nationality)[T.Sierra Leone] | 0.0569 | 0.636 | 0.089 | 0.929 | -1.190 | 1.304 |
| C(nationality)[T.Slovakia] | 0.1364 | 0.622 | 0.219 | 0.826 | -1.082 | 1.355 |
| C(nationality)[T.Slovenia] | 0.1294 | 0.621 | 0.208 | 0.835 | -1.088 | 1.347 |
| C(nationality)[T.Somalia] | 2.773e-15 | 2.41e-15 | 1.150 | 0.250 | -1.95e-15 | 7.5e-15 |
| C(nationality)[T.South Africa] | 0.3130 | 0.626 | 0.500 | 0.617 | -0.914 | 1.540 |
| C(nationality)[T.Spain] | 0.0106 | 0.619 | 0.017 | 0.986 | -1.203 | 1.224 |
| C(nationality)[T.St. Kitts & Nevis] | -0.0153 | 1.065 | -0.014 | 0.989 | -2.104 | 2.073 |
| C(nationality)[T.St. Lucia] | -5.995e-15 | 3.13e-15 | -1.914 | 0.056 | -1.21e-14 | 1.44e-16 |
| C(nationality)[T.Suriname] | 0.0948 | 0.624 | 0.152 | 0.879 | -1.128 | 1.318 |
| C(nationality)[T.Sweden] | 0.2926 | 0.620 | 0.472 | 0.637 | -0.922 | 1.507 |
| C(nationality)[T.Switzerland] | 0.3004 | 0.621 | 0.484 | 0.628 | -0.916 | 1.517 |
| C(nationality)[T.Syria] | 0.1497 | 0.672 | 0.223 | 0.824 | -1.167 | 1.467 |
| C(nationality)[T.Tajikistan] | -0.2960 | 0.796 | -0.372 | 0.710 | -1.857 | 1.265 |
| C(nationality)[T.Tanzania] | -0.0215 | 0.692 | -0.031 | 0.975 | -1.377 | 1.334 |
| C(nationality)[T.Thailand] | 0.2926 | 1.078 | 0.271 | 0.786 | -1.820 | 2.405 |
| C(nationality)[T.The Gambia] | 0.1992 | 0.628 | 0.317 | 0.751 | -1.032 | 1.431 |
| C(nationality)[T.Togo] | 0.1018 | 0.626 | 0.163 | 0.871 | -1.124 | 1.328 |
| C(nationality)[T.Trinidad and Tobago] | 0.3594 | 0.647 | 0.555 | 0.579 | -0.909 | 1.628 |
| C(nationality)[T.Tunisia] | 0.1550 | 0.623 | 0.249 | 0.803 | -1.066 | 1.376 |
| C(nationality)[T.Turkey] | -0.2030 | 0.619 | -0.328 | 0.743 | -1.417 | 1.011 |
| C(nationality)[T.Turkmenistan] | -1.998e-15 | 2.08e-15 | -0.959 | 0.338 | -6.08e-15 | 2.09e-15 |
| C(nationality)[T.Uganda] | -0.0854 | 0.640 | -0.133 | 0.894 | -1.340 | 1.170 |
| C(nationality)[T.Ukraine] | 0.0827 | 0.620 | 0.133 | 0.894 | -1.132 | 1.297 |
| C(nationality)[T.United States] | 0.1972 | 0.621 | 0.317 | 0.751 | -1.020 | 1.415 |
| C(nationality)[T.Uruguay] | 0.3929 | 0.621 | 0.633 | 0.527 | -0.824 | 1.609 |
| C(nationality)[T.Uzbekistan] | 0.3257 | 0.635 | 0.513 | 0.608 | -0.918 | 1.570 |
| C(nationality)[T.Venezuela] | 0.2564 | 0.623 | 0.411 | 0.681 | -0.965 | 1.478 |
| C(nationality)[T.Vietnam] | -0.5556 | 0.870 | -0.638 | 0.523 | -2.261 | 1.150 |
| C(nationality)[T.Wales] | 0.1350 | 0.623 | 0.217 | 0.828 | -1.085 | 1.355 |
| C(nationality)[T.Zambia] | 0.2029 | 0.638 | 0.318 | 0.750 | -1.047 | 1.453 |
| C(nationality)[T.Zimbabwe] | -0.0694 | 0.634 | -0.110 | 0.913 | -1.312 | 1.173 |
| C(position)[T.Defender] | 0.7322 | 0.236 | 3.101 | 0.002 | 0.269 | 1.195 |
| C(position)[T.Goalkeeper] | 0.5413 | 0.040 | 13.433 | 0.000 | 0.462 | 0.620 |
| C(position)[T.Midfield] | 1.1854 | 0.072 | 16.373 | 0.000 | 1.044 | 1.327 |
| C(sub_position)[T.Centre-Back] | 0.6193 | 0.251 | 2.463 | 0.014 | 0.126 | 1.112 |
| C(sub_position)[T.Left-Back] | 0.5995 | 0.252 | 2.381 | 0.017 | 0.106 | 1.093 |
| C(sub_position)[T.Right-Back] | 0.5402 | 0.252 | 2.146 | 0.032 | 0.047 | 1.034 |
| C(sub_position)[T.Goalkeeper] | 0.5413 | 0.040 | 13.433 | 0.000 | 0.462 | 0.620 |
| C(sub_position)[T.Attack] | 1.1723 | 0.209 | 5.614 | 0.000 | 0.763 | 1.582 |
| C(sub_position)[T.Centre-Forward] | 1.5598 | 0.079 | 19.835 | 0.000 | 1.406 | 1.714 |
| C(sub_position)[T.Left Winger] | 1.5755 | 0.078 | 20.142 | 0.000 | 1.422 | 1.729 |
| C(sub_position)[T.Right Winger] | 1.5731 | 0.078 | 20.115 | 0.000 | 1.420 | 1.726 |
| C(sub_position)[T.Second Striker] | 1.6066 | 0.085 | 18.835 | 0.000 | 1.439 | 1.774 |
| C(sub_position)[T.Midfield] | 0.1833 | 0.177 | 1.038 | 0.299 | -0.163 | 0.530 |
| C(sub_position)[T.Attacking Midfield] | 1.5846 | 0.078 | 20.235 | 0.000 | 1.431 | 1.738 |
| C(sub_position)[T.Central Midfield] | 0.3165 | 0.040 | 7.839 | 0.000 | 0.237 | 0.396 |
| C(sub_position)[T.Defensive Midfield] | 0.2802 | 0.041 | 6.818 | 0.000 | 0.200 | 0.361 |
| C(sub_position)[T.Left Midfield] | 0.2029 | 0.050 | 4.079 | 0.000 | 0.105 | 0.300 |
| C(sub_position)[T.Right Midfield] | 0.2025 | 0.050 | 4.030 | 0.000 | 0.104 | 0.301 |
| C(club_name)[T.1 Fc Nurnberg] | -0.4317 | 0.161 | -2.680 | 0.007 | -0.747 | -0.116 |
| C(club_name)[T.1 Fc Union Berlin] | -0.2316 | 0.115 | -2.015 | 0.044 | -0.457 | -0.006 |
| C(club_name)[T.1 Fsv Mainz 05] | 0.1472 | 0.090 | 1.630 | 0.103 | -0.030 | 0.324 |
| C(club_name)[T.Aalborg Bk] | -1.5279 | 0.094 | -16.222 | 0.000 | -1.712 | -1.343 |
| C(club_name)[T.Aarhus Gf] | -1.5129 | 0.095 | -15.951 | 0.000 | -1.699 | -1.327 |
| C(club_name)[T.Aberdeen Fc] | -1.5270 | 0.097 | -15.813 | 0.000 | -1.716 | -1.338 |
| C(club_name)[T.Ac Florenz] | 0.6624 | 0.094 | 7.084 | 0.000 | 0.479 | 0.846 |
| C(club_name)[T.Ac Horsens] | -1.7678 | 0.103 | -17.220 | 0.000 | -1.969 | -1.567 |
| C(club_name)[T.Ac Mailand] | 1.1315 | 0.091 | 12.494 | 0.000 | 0.954 | 1.309 |
| C(club_name)[T.Academica Coimbra] | -1.3916 | 0.135 | -10.283 | 0.000 | -1.657 | -1.126 |
| C(club_name)[T.Acn Siena 1904] | -1.3519 | 0.360 | -3.754 | 0.000 | -2.058 | -0.646 |
| C(club_name)[T.Adana Demirspor] | -0.7369 | 0.193 | -3.813 | 0.000 | -1.116 | -0.358 |
| C(club_name)[T.Adanaspor] | -1.1385 | 0.187 | -6.100 | 0.000 | -1.504 | -0.773 |
| C(club_name)[T.Ado Den Haag] | -1.3834 | 0.096 | -14.400 | 0.000 | -1.572 | -1.195 |
| C(club_name)[T.Ae Larisa] | -1.6791 | 0.099 | -17.004 | 0.000 | -1.873 | -1.486 |
| C(club_name)[T.Aek Athen] | -0.8114 | 0.093 | -8.706 | 0.000 | -0.994 | -0.629 |
| C(club_name)[T.Ael Kalloni] | -1.7837 | 0.132 | -13.534 | 0.000 | -2.042 | -1.525 |
| C(club_name)[T.Afc Bournemouth] | 0.5288 | 0.103 | 5.125 | 0.000 | 0.327 | 0.731 |
| C(club_name)[T.Afc Sunderland] | 0.4575 | 0.125 | 3.664 | 0.000 | 0.213 | 0.702 |
| C(club_name)[T.Ajax Amsterdam] | 0.3610 | 0.092 | 3.920 | 0.000 | 0.181 | 0.542 |
| C(club_name)[T.Akhisarspor] | -0.7058 | 0.104 | -6.812 | 0.000 | -0.909 | -0.503 |
| C(club_name)[T.Akhmat Grozny] | -0.5927 | 0.095 | -6.271 | 0.000 | -0.778 | -0.407 |
| C(club_name)[T.Alanyaspor] | -0.7063 | 0.098 | -7.183 | 0.000 | -0.899 | -0.514 |
| C(club_name)[T.Altay Sk] | -1.5395 | 0.197 | -7.801 | 0.000 | -1.926 | -1.153 |
| C(club_name)[T.Amiens Sc] | -0.5288 | 0.118 | -4.477 | 0.000 | -0.760 | -0.297 |
| C(club_name)[T.Amkar Perm] | -1.2030 | 0.114 | -10.531 | 0.000 | -1.427 | -0.979 |
| C(club_name)[T.Ankaraspor] | -0.4685 | 0.116 | -4.044 | 0.000 | -0.696 | -0.241 |
| C(club_name)[T.Antalyaspor] | -0.7064 | 0.093 | -7.579 | 0.000 | -0.889 | -0.524 |
| C(club_name)[T.Anzhi Makhachkala] | -0.9036 | 0.101 | -8.986 | 0.000 | -1.101 | -0.707 |
| C(club_name)[T.Ao Platanias] | -1.7041 | 0.110 | -15.488 | 0.000 | -1.920 | -1.488 |
| C(club_name)[T.Ao Xanthi] | -1.6390 | 0.099 | -16.620 | 0.000 | -1.832 | -1.446 |
| C(club_name)[T.Aok Kerkyra] | -1.8408 | 0.117 | -15.786 | 0.000 | -2.069 | -1.612 |
| C(club_name)[T.Apo Levadiakos] | -1.6971 | 0.101 | -16.732 | 0.000 | -1.896 | -1.498 |
| C(club_name)[T.Apollon Smyrnis] | -1.7292 | 0.112 | -15.485 | 0.000 | -1.948 | -1.510 |
| C(club_name)[T.Aris Thessaloniki] | -1.2511 | 0.108 | -11.565 | 0.000 | -1.463 | -1.039 |
| C(club_name)[T.Arminia Bielefeld] | -0.1342 | 0.145 | -0.929 | 0.353 | -0.418 | 0.149 |
| C(club_name)[T.Arsenal Kiew] | -1.7248 | 0.138 | -12.469 | 0.000 | -1.996 | -1.454 |
| C(club_name)[T.Arsenal Tula] | -0.8930 | 0.094 | -9.467 | 0.000 | -1.078 | -0.708 |
| C(club_name)[T.As Livorno] | -0.5891 | 0.615 | -0.958 | 0.338 | -1.794 | 0.616 |
| C(club_name)[T.As Monaco] | 0.7894 | 0.089 | 8.829 | 0.000 | 0.614 | 0.965 |
| C(club_name)[T.As Nancy Lorraine] | -1.0206 | 0.184 | -5.560 | 0.000 | -1.380 | -0.661 |
| C(club_name)[T.As Rom] | 1.1229 | 0.092 | 12.210 | 0.000 | 0.943 | 1.303 |
| C(club_name)[T.As Saint Etienne] | 0.0600 | 0.092 | 0.652 | 0.515 | -0.120 | 0.240 |
| C(club_name)[T.Asteras Tripolis] | -1.4837 | 0.091 | -16.381 | 0.000 | -1.661 | -1.306 |
| C(club_name)[T.Aston Villa] | 1.0295 | 0.106 | 9.725 | 0.000 | 0.822 | 1.237 |
| C(club_name)[T.Atalanta Bergamo] | 0.3343 | 0.092 | 3.634 | 0.000 | 0.154 | 0.515 |
| C(club_name)[T.Athletic Bilbao] | 0.5015 | 0.095 | 5.265 | 0.000 | 0.315 | 0.688 |
| C(club_name)[T.Atletico Madrid] | 1.4834 | 0.094 | 15.796 | 0.000 | 1.299 | 1.668 |
| C(club_name)[T.Atromitos Athen] | -1.3779 | 0.091 | -15.076 | 0.000 | -1.557 | -1.199 |
| C(club_name)[T.Az Alkmaar] | -0.6275 | 0.094 | -6.687 | 0.000 | -0.811 | -0.444 |
| C(club_name)[T.Balikesirspor] | -0.8422 | 0.178 | -4.728 | 0.000 | -1.191 | -0.493 |
| C(club_name)[T.Bayer 04 Leverkusen] | 1.0550 | 0.094 | 11.225 | 0.000 | 0.871 | 1.239 |
| C(club_name)[T.Beerschot V A ] | -1.2380 | 0.144 | -8.581 | 0.000 | -1.521 | -0.955 |
| C(club_name)[T.Belenenses Sad] | -1.3607 | 0.092 | -14.824 | 0.000 | -1.541 | -1.181 |
| C(club_name)[T.Benevento Calcio] | -0.3116 | 0.126 | -2.476 | 0.013 | -0.558 | -0.065 |
| C(club_name)[T.Benfica Lissabon] | 0.5862 | 0.093 | 6.337 | 0.000 | 0.405 | 0.768 |
| C(club_name)[T.Besiktas Istanbul] | 0.3317 | 0.093 | 3.585 | 0.000 | 0.150 | 0.513 |
| C(club_name)[T.Boavista Porto Fc] | -1.4929 | 0.092 | -16.235 | 0.000 | -1.673 | -1.313 |
| C(club_name)[T.Borussia Dortmund] | 1.1853 | 0.090 | 13.209 | 0.000 | 1.009 | 1.361 |
| C(club_name)[T.Borussia Monchengladbach] | 0.7169 | 0.094 | 7.667 | 0.000 | 0.534 | 0.900 |
| C(club_name)[T.Brescia Calcio] | 0.0036 | 0.144 | 0.025 | 0.980 | -0.278 | 0.285 |
| C(club_name)[T.Brighton Amp Hove Albion] | 0.8222 | 0.103 | 7.976 | 0.000 | 0.620 | 1.024 |
| C(club_name)[T.Brondby If] | -1.0551 | 0.093 | -11.397 | 0.000 | -1.237 | -0.874 |
| C(club_name)[T.Bursaspor] | -0.3622 | 0.103 | -3.530 | 0.000 | -0.563 | -0.161 |
| C(club_name)[T.Buyuksehir Belediye Erzurumspor] | -1.4923 | 0.142 | -10.498 | 0.000 | -1.771 | -1.214 |
| C(club_name)[T.Ca Osasuna] | -0.3393 | 0.108 | -3.155 | 0.002 | -0.550 | -0.128 |
| C(club_name)[T.Cagliari Calcio] | 0.1297 | 0.096 | 1.347 | 0.178 | -0.059 | 0.318 |
| C(club_name)[T.Cardiff City] | 0.1495 | 0.162 | 0.921 | 0.357 | -0.169 | 0.468 |
| C(club_name)[T.Carpi Fc 1909] | -0.3453 | 0.151 | -2.289 | 0.022 | -0.641 | -0.050 |
| C(club_name)[T.Catania Calcio] | -0.0183 | 0.504 | -0.036 | 0.971 | -1.006 | 0.969 |
| C(club_name)[T.Caykur Rizespor] | -0.7575 | 0.098 | -7.737 | 0.000 | -0.949 | -0.566 |
| C(club_name)[T.Cd Feirense] | -1.7269 | 0.113 | -15.217 | 0.000 | -1.949 | -1.504 |
| C(club_name)[T.Cd Leganes] | -0.1080 | 0.106 | -1.018 | 0.309 | -0.316 | 0.100 |
| C(club_name)[T.Cd Nacional] | -1.4014 | 0.101 | -13.849 | 0.000 | -1.600 | -1.203 |
| C(club_name)[T.Cd Santa Clara] | -1.5712 | 0.105 | -15.028 | 0.000 | -1.776 | -1.366 |
| C(club_name)[T.Cd Tondela] | -1.5660 | 0.094 | -16.580 | 0.000 | -1.751 | -1.381 |
| C(club_name)[T.Celta Vigo] | 0.2913 | 0.095 | 3.066 | 0.002 | 0.105 | 0.477 |
| C(club_name)[T.Celtic Glasgow] | -0.2140 | 0.090 | -2.364 | 0.018 | -0.391 | -0.037 |
| C(club_name)[T.Cercle Brugge] | -1.0264 | 0.098 | -10.474 | 0.000 | -1.218 | -0.834 |
| C(club_name)[T.Cesena Fc] | -0.9346 | 0.163 | -5.751 | 0.000 | -1.253 | -0.616 |
| C(club_name)[T.Cf Uniao Madeira] | -1.9166 | 0.164 | -11.662 | 0.000 | -2.239 | -1.594 |
| C(club_name)[T.Chievo Verona] | -0.7466 | 0.106 | -7.046 | 0.000 | -0.954 | -0.539 |
| C(club_name)[T.Chornomorets Odessa] | -1.5354 | 0.103 | -14.961 | 0.000 | -1.737 | -1.334 |
| C(club_name)[T.Clermont Foot 63] | -0.5879 | 0.190 | -3.089 | 0.002 | -0.961 | -0.215 |
| C(club_name)[T.Crystal Palace] | 0.8449 | 0.093 | 9.108 | 0.000 | 0.663 | 1.027 |
| C(club_name)[T.Cs Maritimo] | -1.3702 | 0.093 | -14.733 | 0.000 | -1.553 | -1.188 |
| C(club_name)[T.De Graafschap Doetinchem] | -1.9809 | 0.142 | -13.907 | 0.000 | -2.260 | -1.702 |
| C(club_name)[T.Delfino Pescara 1936] | -0.5963 | 0.153 | -3.895 | 0.000 | -0.896 | -0.296 |
| C(club_name)[T.Denizlispor] | -1.3437 | 0.146 | -9.228 | 0.000 | -1.629 | -1.058 |
| C(club_name)[T.Deportivo Alaves] | -0.1042 | 0.096 | -1.088 | 0.277 | -0.292 | 0.084 |
| C(club_name)[T.Deportivo La Coruna] | -0.1085 | 0.110 | -0.988 | 0.323 | -0.324 | 0.107 |
| C(club_name)[T.Desna Chernigiv] | -1.4630 | 0.113 | -12.934 | 0.000 | -1.685 | -1.241 |
| C(club_name)[T.Desportivo Aves] | -1.6479 | 0.112 | -14.768 | 0.000 | -1.867 | -1.429 |
| C(club_name)[T.Dijon Fco] | -0.5173 | 0.104 | -4.986 | 0.000 | -0.721 | -0.314 |
| C(club_name)[T.Dinamo Moskau] | -0.0238 | 0.098 | -0.243 | 0.808 | -0.216 | 0.169 |
| C(club_name)[T.Dnipro Dnipropetrovsk] | -0.4554 | 0.119 | -3.823 | 0.000 | -0.689 | -0.222 |
| C(club_name)[T.Dundee Fc] | -1.8532 | 0.106 | -17.496 | 0.000 | -2.061 | -1.646 |
| C(club_name)[T.Dundee United Fc] | -1.8575 | 0.114 | -16.226 | 0.000 | -2.082 | -1.633 |
| C(club_name)[T.Dynamo Kiew] | 0.1897 | 0.095 | 2.003 | 0.045 | 0.004 | 0.375 |
| C(club_name)[T.Ea Guingamp] | -0.6557 | 0.106 | -6.165 | 0.000 | -0.864 | -0.447 |
| C(club_name)[T.Eintracht Braunschweig] | -0.6474 | 0.615 | -1.053 | 0.293 | -1.853 | 0.558 |
| C(club_name)[T.Eintracht Frankfurt] | 0.1699 | 0.092 | 1.854 | 0.064 | -0.010 | 0.350 |
| C(club_name)[T.Enisey Krasnoyarsk] | -1.1801 | 0.147 | -8.045 | 0.000 | -1.468 | -0.893 |
| C(club_name)[T.Es Troyes Ac] | -0.8396 | 0.119 | -7.054 | 0.000 | -1.073 | -0.606 |
| C(club_name)[T.Esbjerg Fb] | -1.5711 | 0.098 | -16.056 | 0.000 | -1.763 | -1.379 |
| C(club_name)[T.Eskisehirspor] | -0.4834 | 0.138 | -3.495 | 0.000 | -0.754 | -0.212 |
| C(club_name)[T.Espanyol Barcelona] | 0.0058 | 0.095 | 0.061 | 0.951 | -0.181 | 0.193 |
| C(club_name)[T.Fatih Karagumruk] | -0.9856 | 0.135 | -7.299 | 0.000 | -1.250 | -0.721 |
| C(club_name)[T.Fc Arouca] | -1.3794 | 0.108 | -12.830 | 0.000 | -1.590 | -1.169 |
| C(club_name)[T.Fc Arsenal] | 1.6111 | 0.093 | 17.333 | 0.000 | 1.429 | 1.793 |
| C(club_name)[T.Fc Augsburg] | 0.0105 | 0.092 | 0.114 | 0.909 | -0.170 | 0.191 |
| C(club_name)[T.Fc Barcelona] | 1.7110 | 0.093 | 18.370 | 0.000 | 1.528 | 1.894 |
| C(club_name)[T.Fc Bayern Munchen] | 1.5157 | 0.092 | 16.526 | 0.000 | 1.336 | 1.695 |
| C(club_name)[T.Fc Bologna] | 0.1477 | 0.092 | 1.597 | 0.110 | -0.034 | 0.329 |
| C(club_name)[T.Fc Brentford] | 0.7501 | 0.171 | 4.396 | 0.000 | 0.416 | 1.084 |
| C(club_name)[T.Fc Brugge] | 0.0521 | 0.092 | 0.567 | 0.571 | -0.128 | 0.232 |
| C(club_name)[T.Fc Burnley] | 0.5230 | 0.100 | 5.219 | 0.000 | 0.327 | 0.719 |
| C(club_name)[T.Fc Cadiz] | -0.5310 | 0.138 | -3.862 | 0.000 | -0.800 | -0.261 |
| C(club_name)[T.Fc Chelsea] | 1.8776 | 0.095 | 19.687 | 0.000 | 1.691 | 2.065 |
| C(club_name)[T.Fc Cordoba] | -0.5124 | 0.175 | -2.926 | 0.003 | -0.856 | -0.169 |
| C(club_name)[T.Fc Crotone] | -0.7507 | 0.114 | -6.558 | 0.000 | -0.975 | -0.526 |
| C(club_name)[T.Fc Dordrecht] | -2.1215 | 0.176 | -12.063 | 0.000 | -2.466 | -1.777 |
| C(club_name)[T.Fc Elche] | -0.6140 | 0.125 | -4.927 | 0.000 | -0.858 | -0.370 |
| C(club_name)[T.Fc Emmen] | -1.6816 | 0.117 | -14.314 | 0.000 | -1.912 | -1.451 |
| C(club_name)[T.Fc Empoli] | -0.3594 | 0.104 | -3.460 | 0.001 | -0.563 | -0.156 |
| C(club_name)[T.Fc Everton] | 1.3583 | 0.093 | 14.596 | 0.000 | 1.176 | 1.541 |
| C(club_name)[T.Fc Famalicao] | -0.6412 | 0.116 | -5.513 | 0.000 | -0.869 | -0.413 |
| C(club_name)[T.Fc Fulham] | 1.0161 | 0.128 | 7.949 | 0.000 | 0.766 | 1.267 |
| C(club_name)[T.Fc Getafe] | 0.1100 | 0.095 | 1.154 | 0.249 | -0.077 | 0.297 |
| C(club_name)[T.Fc Girona] | -0.3340 | 0.132 | -2.528 | 0.011 | -0.593 | -0.075 |
| C(club_name)[T.Fc Girondins Bordeaux] | 0.0024 | 0.092 | 0.026 | 0.979 | -0.178 | 0.183 |
| C(club_name)[T.Fc Granada] | -0.1890 | 0.098 | -1.920 | 0.055 | -0.382 | 0.004 |
| C(club_name)[T.Fc Groningen] | -1.0642 | 0.095 | -11.241 | 0.000 | -1.250 | -0.879 |
| C(club_name)[T.Fc Helsingor] | -2.1088 | 0.141 | -15.009 | 0.000 | -2.384 | -1.833 |
| C(club_name)[T.Fc Ingolstadt 04] | -0.6583 | 0.145 | -4.550 | 0.000 | -0.942 | -0.375 |
| C(club_name)[T.Fc Kopenhagen] | -0.6859 | 0.092 | -7.431 | 0.000 | -0.867 | -0.505 |
| C(club_name)[T.Fc Liverpool] | 1.6996 | 0.093 | 18.214 | 0.000 | 1.517 | 1.883 |
| C(club_name)[T.Fc Lorient] | -0.5532 | 0.104 | -5.330 | 0.000 | -0.757 | -0.350 |
| C(club_name)[T.Fc Malaga] | -0.0139 | 0.109 | -0.127 | 0.899 | -0.228 | 0.200 |
| C(club_name)[T.Fc Metz] | -0.5942 | 0.100 | -5.955 | 0.000 | -0.790 | -0.399 |
| C(club_name)[T.Fc Middlesbrough] | 0.5601 | 0.151 | 3.714 | 0.000 | 0.264 | 0.856 |
| C(club_name)[T.Fc Midtjylland] | -1.1445 | 0.092 | -12.459 | 0.000 | -1.325 | -0.964 |
| C(club_name)[T.Fc Nantes] | -0.3069 | 0.093 | -3.285 | 0.001 | -0.490 | -0.124 |
| C(club_name)[T.Fc Nordsjaelland] | -1.4400 | 0.094 | -15.285 | 0.000 | -1.625 | -1.255 |
| C(club_name)[T.Fc Pacos De Ferreira] | -1.4280 | 0.094 | -15.227 | 0.000 | -1.612 | -1.244 |
| C(club_name)[T.Fc Paris Saint Germain] | 1.5497 | 0.092 | 16.917 | 0.000 | 1.370 | 1.729 |
| C(club_name)[T.Fc Penafiel] | -1.3899 | 0.173 | -8.022 | 0.000 | -1.729 | -1.050 |
| C(club_name)[T.Fc Porto] | 0.6154 | 0.093 | 6.625 | 0.000 | 0.433 | 0.797 |
| C(club_name)[T.Fc Reading] | 0.0666 | 0.250 | 0.267 | 0.790 | -0.423 | 0.556 |
| C(club_name)[T.Fc Schalke 04] | 0.7035 | 0.094 | 7.517 | 0.000 | 0.520 | 0.887 |
| C(club_name)[T.Fc Sevilla] | 0.7523 | 0.091 | 8.255 | 0.000 | 0.574 | 0.931 |
| C(club_name)[T.Fc Southampton] | 1.0930 | 0.096 | 11.375 | 0.000 | 0.905 | 1.281 |
| C(club_name)[T.Fc Stade Rennes] | 0.1305 | 0.093 | 1.399 | 0.162 | -0.052 | 0.313 |
| C(club_name)[T.Fc Toulouse] | -0.2016 | 0.099 | -2.030 | 0.042 | -0.396 | -0.007 |
| C(club_name)[T.Fc Turin] | 0.2900 | 0.091 | 3.173 | 0.002 | 0.111 | 0.469 |
| C(club_name)[T.Fc Twente Enschede] | -1.0894 | 0.096 | -11.297 | 0.000 | -1.278 | -0.900 |
| C(club_name)[T.Fc Utrecht] | -0.8461 | 0.091 | -9.264 | 0.000 | -1.025 | -0.667 |
| C(club_name)[T.Fc Valencia] | 1.0918 | 0.094 | 11.581 | 0.000 | 0.907 | 1.277 |
| C(club_name)[T.Fc Vestsjaelland] | -1.6677 | 0.161 | -10.358 | 0.000 | -1.983 | -1.352 |
| C(club_name)[T.Fc Villarreal] | 0.5231 | 0.093 | 5.609 | 0.000 | 0.340 | 0.706 |
| C(club_name)[T.Fc Vizela] | -1.6326 | 0.157 | -10.397 | 0.000 | -1.940 | -1.325 |
| C(club_name)[T.Fc Watford] | 0.6893 | 0.096 | 7.206 | 0.000 | 0.502 | 0.877 |
| C(club_name)[T.Fenerbahce Istanbul] | 0.4138 | 0.091 | 4.537 | 0.000 | 0.235 | 0.593 |
| C(club_name)[T.Feyenoord Rotterdam] | -0.0843 | 0.094 | -0.900 | 0.368 | -0.268 | 0.099 |
| C(club_name)[T.Fk Khimki] | -0.8216 | 0.134 | -6.126 | 0.000 | -1.084 | -0.559 |
| C(club_name)[T.Fk Krasnodar] | 0.1640 | 0.092 | 1.785 | 0.074 | -0.016 | 0.344 |
| C(club_name)[T.Fk Mariupol] | -1.4254 | 0.107 | -13.288 | 0.000 | -1.636 | -1.215 |
| C(club_name)[T.Fk Minaj] | -2.0774 | 0.161 | -12.889 | 0.000 | -2.393 | -1.761 |
| C(club_name)[T.Fk Nizhny Novgorod] | -0.8727 | 0.160 | -5.451 | 0.000 | -1.186 | -0.559 |
| C(club_name)[T.Fk Oleksandriya] | -1.4728 | 0.100 | -14.669 | 0.000 | -1.670 | -1.276 |
| C(club_name)[T.Fk Orenburg] | -0.9950 | 0.108 | -9.191 | 0.000 | -1.207 | -0.783 |
| C(club_name)[T.Fk Rostov] | -0.5372 | 0.092 | -5.861 | 0.000 | -0.717 | -0.358 |
| C(club_name)[T.Fk Sochi] | -0.5095 | 0.112 | -4.536 | 0.000 | -0.730 | -0.289 |
| C(club_name)[T.Fk Tosno] | -0.9699 | 0.142 | -6.807 | 0.000 | -1.249 | -0.691 |
| C(club_name)[T.Fk Ufa] | -0.9917 | 0.095 | -10.404 | 0.000 | -1.178 | -0.805 |
| C(club_name)[T.Fortuna Dusseldorf] | -0.0906 | 0.129 | -0.702 | 0.483 | -0.344 | 0.162 |
| C(club_name)[T.Fortuna Sittard] | -1.4591 | 0.109 | -13.425 | 0.000 | -1.672 | -1.246 |
| C(club_name)[T.Frosinone Calcio] | -0.4257 | 0.132 | -3.233 | 0.001 | -0.684 | -0.168 |
| C(club_name)[T.Galatasaray Istanbul] | 0.3253 | 0.093 | 3.510 | 0.000 | 0.144 | 0.507 |
| C(club_name)[T.Gaziantep Fk] | -0.9391 | 0.121 | -7.791 | 0.000 | -1.175 | -0.703 |
| C(club_name)[T.Gaziantepspor] | -0.7816 | 0.121 | -6.485 | 0.000 | -1.018 | -0.545 |
| C(club_name)[T.Gd Chaves] | -1.2776 | 0.114 | -11.200 | 0.000 | -1.501 | -1.054 |
| C(club_name)[T.Gd Estoril Praia] | -1.2619 | 0.101 | -12.495 | 0.000 | -1.460 | -1.064 |
| C(club_name)[T.Genclerbirligi Ankara] | -0.8590 | 0.099 | -8.662 | 0.000 | -1.053 | -0.665 |
| C(club_name)[T.Genua Cfc] | 0.1740 | 0.093 | 1.867 | 0.062 | -0.009 | 0.357 |
| C(club_name)[T.Gfc Ajaccio] | -1.5755 | 0.197 | -7.984 | 0.000 | -1.962 | -1.189 |
| C(club_name)[T.Gil Vicente Fc] | -1.4183 | 0.111 | -12.775 | 0.000 | -1.636 | -1.201 |
| C(club_name)[T.Giresunspor] | -0.6902 | 0.221 | -3.121 | 0.002 | -1.124 | -0.257 |
| C(club_name)[T.Glasgow Rangers] | -0.5717 | 0.097 | -5.891 | 0.000 | -0.762 | -0.382 |
| C(club_name)[T.Go Ahead Eagles Deventer] | -1.8490 | 0.131 | -14.147 | 0.000 | -2.105 | -1.593 |
| C(club_name)[T.Goverla Uzhgorod] | -1.5101 | 0.133 | -11.325 | 0.000 | -1.771 | -1.249 |
| C(club_name)[T.Goztepe] | -0.7884 | 0.104 | -7.596 | 0.000 | -0.992 | -0.585 |
| C(club_name)[T.Gs Ergotelis] | -1.4769 | 0.158 | -9.376 | 0.000 | -1.786 | -1.168 |
| C(club_name)[T.Hamburger Sv] | -0.0592 | 0.111 | -0.531 | 0.596 | -0.278 | 0.159 |
| C(club_name)[T.Hamilton Academical Fc] | -2.2085 | 0.103 | -21.471 | 0.000 | -2.410 | -2.007 |
| C(club_name)[T.Hannover 96] | -0.1362 | 0.109 | -1.249 | 0.212 | -0.350 | 0.077 |
| C(club_name)[T.Hatayspor] | -1.1515 | 0.151 | -7.643 | 0.000 | -1.447 | -0.856 |
| C(club_name)[T.Heart Of Midlothian Fc] | -1.3612 | 0.098 | -13.849 | 0.000 | -1.554 | -1.169 |
| C(club_name)[T.Hellas Verona] | -0.1981 | 0.096 | -2.061 | 0.039 | -0.386 | -0.010 |
| C(club_name)[T.Heracles Almelo] | -1.5340 | 0.093 | -16.459 | 0.000 | -1.717 | -1.351 |
| C(club_name)[T.Hertha Bsc] | 0.3520 | 0.093 | 3.801 | 0.000 | 0.170 | 0.534 |
| C(club_name)[T.Hibernian Fc] | -1.3005 | 0.106 | -12.221 | 0.000 | -1.509 | -1.092 |
| C(club_name)[T.Hobro Ik] | -1.9278 | 0.100 | -19.241 | 0.000 | -2.124 | -1.731 |
| C(club_name)[T.Huddersfield Town] | 0.1019 | 0.132 | 0.770 | 0.441 | -0.157 | 0.361 |
| C(club_name)[T.Hull City] | 0.5443 | 0.126 | 4.336 | 0.000 | 0.298 | 0.790 |
| C(club_name)[T.Ingulets Petrove] | -1.9041 | 0.150 | -12.726 | 0.000 | -2.197 | -1.611 |
| C(club_name)[T.Inter Mailand] | 1.1275 | 0.092 | 12.231 | 0.000 | 0.947 | 1.308 |
| C(club_name)[T.Inverness Caledonian Thistle Fc] | -2.3269 | 0.142 | -16.378 | 0.000 | -2.605 | -2.048 |
| C(club_name)[T.Ionikos Nikeas] | -1.8850 | 0.194 | -9.718 | 0.000 | -2.265 | -1.505 |
| C(club_name)[T.Iraklis Thessaloniki] | -1.8768 | 0.133 | -14.118 | 0.000 | -2.137 | -1.616 |
| C(club_name)[T.Istanbul Basaksehir Fk] | -0.1543 | 0.092 | -1.673 | 0.094 | -0.335 | 0.026 |
| C(club_name)[T.Juventus Turin] | 1.5162 | 0.093 | 16.295 | 0.000 | 1.334 | 1.699 |
| C(club_name)[T.Kaa Gent] | -0.3321 | 0.090 | -3.698 | 0.000 | -0.508 | -0.156 |
| C(club_name)[T.Kardemir Karabukspor] | -0.7224 | 0.118 | -6.145 | 0.000 | -0.953 | -0.492 |
| C(club_name)[T.Karpaty Lviv] | -1.4505 | 0.101 | -14.417 | 0.000 | -1.648 | -1.253 |
| C(club_name)[T.Kas Eupen] | -1.2322 | 0.095 | -12.937 | 0.000 | -1.419 | -1.045 |
| C(club_name)[T.Kasimpasa] | -0.6726 | 0.094 | -7.151 | 0.000 | -0.857 | -0.488 |
| C(club_name)[T.Kayseri Erciyesspor] | -0.5048 | 0.173 | -2.920 | 0.003 | -0.844 | -0.166 |
| C(club_name)[T.Kayserispor] | -0.8104 | 0.095 | -8.521 | 0.000 | -0.997 | -0.624 |
| C(club_name)[T.Kilmarnock Fc] | -1.8195 | 0.104 | -17.417 | 0.000 | -2.024 | -1.615 |
| C(club_name)[T.Kolos Kovalivka] | -1.7267 | 0.121 | -14.235 | 0.000 | -1.964 | -1.489 |
| C(club_name)[T.Konyaspor] | -0.8162 | 0.094 | -8.726 | 0.000 | -1.000 | -0.633 |
| C(club_name)[T.Krc Genk] | -0.2253 | 0.091 | -2.485 | 0.013 | -0.403 | -0.048 |
| C(club_name)[T.Krylya Sovetov Samara] | -0.5163 | 0.097 | -5.315 | 0.000 | -0.707 | -0.326 |
| C(club_name)[T.Ksc Lokeren] | -0.9675 | 0.099 | -9.812 | 0.000 | -1.161 | -0.774 |
| C(club_name)[T.Kuban Krasnodar] | -0.5157 | 0.149 | -3.459 | 0.001 | -0.808 | -0.223 |
| C(club_name)[T.Kv Kortrijk] | -0.9979 | 0.092 | -10.816 | 0.000 | -1.179 | -0.817 |
| C(club_name)[T.Kv Mechelen] | -0.9507 | 0.093 | -10.262 | 0.000 | -1.132 | -0.769 |
| C(club_name)[T.Kv Oostende] | -0.9291 | 0.091 | -10.212 | 0.000 | -1.107 | -0.751 |
| C(club_name)[T.Kvc Westerlo] | -1.3170 | 0.125 | -10.509 | 0.000 | -1.563 | -1.071 |
| C(club_name)[T.Lazio Rom] | 0.5711 | 0.092 | 6.199 | 0.000 | 0.391 | 0.752 |
| C(club_name)[T.Leeds United] | 0.8647 | 0.133 | 6.512 | 0.000 | 0.604 | 1.125 |
| C(club_name)[T.Leicester City] | 0.9903 | 0.095 | 10.397 | 0.000 | 0.804 | 1.177 |
| C(club_name)[T.Lierse Sk] | -1.0264 | 0.162 | -6.326 | 0.000 | -1.344 | -0.708 |
| C(club_name)[T.Livingston Fc] | -1.8915 | 0.111 | -17.061 | 0.000 | -2.109 | -1.674 |
| C(club_name)[T.Lokomotiv Moskau] | 0.0895 | 0.094 | 0.953 | 0.341 | -0.095 | 0.274 |
| C(club_name)[T.Losc Lille] | 0.3092 | 0.094 | 3.283 | 0.001 | 0.125 | 0.494 |
| C(club_name)[T.Lyngby Bk] | -1.8259 | 0.104 | -17.518 | 0.000 | -2.030 | -1.622 |
| C(club_name)[T.Manchester City] | 1.8900 | 0.095 | 19.922 | 0.000 | 1.704 | 2.076 |
| C(club_name)[T.Manchester United] | 1.7671 | 0.093 | 18.972 | 0.000 | 1.584 | 1.950 |
| C(club_name)[T.Mersin Idmanyurdu] | -1.1341 | 0.140 | -8.072 | 0.000 | -1.410 | -0.859 |
| C(club_name)[T.Metalist 1925 Kharkiv] | -1.7768 | 0.174 | -10.234 | 0.000 | -2.117 | -1.437 |
| C(club_name)[T.Metalist Kharkiv] | -0.6394 | 0.130 | -4.936 | 0.000 | -0.893 | -0.386 |
| C(club_name)[T.Metalurg Donetsk] | -0.9642 | 0.191 | -5.044 | 0.000 | -1.339 | -0.589 |
| C(club_name)[T.Metalurg Zaporizhya Bis 2016 ] | -1.3907 | 0.139 | -10.008 | 0.000 | -1.663 | -1.118 |
| C(club_name)[T.Mke Ankaragucu] | -1.3822 | 0.112 | -12.387 | 0.000 | -1.601 | -1.164 |
| C(club_name)[T.Montpellier Hsc] | -0.4171 | 0.094 | -4.439 | 0.000 | -0.601 | -0.233 |
| C(club_name)[T.Mordovia Saransk] | -0.7665 | 0.149 | -5.137 | 0.000 | -1.059 | -0.474 |
| C(club_name)[T.Moreirense Fc] | -1.5211 | 0.091 | -16.660 | 0.000 | -1.700 | -1.342 |
| C(club_name)[T.Motherwell Fc] | -1.7677 | 0.100 | -17.611 | 0.000 | -1.964 | -1.571 |
| C(club_name)[T.Nac Breda] | -1.6118 | 0.119 | -13.585 | 0.000 | -1.844 | -1.379 |
| C(club_name)[T.Nec Nijmegen] | -1.4953 | 0.123 | -12.185 | 0.000 | -1.736 | -1.255 |
| C(club_name)[T.Newcastle United] | 1.0856 | 0.096 | 11.365 | 0.000 | 0.898 | 1.273 |
| C(club_name)[T.Niki Volou] | -1.7074 | 0.187 | -9.119 | 0.000 | -2.074 | -1.340 |
| C(club_name)[T.Nimes Olympique] | -0.2437 | 0.121 | -2.021 | 0.043 | -0.480 | -0.007 |
| C(club_name)[T.Nk Veres Rivne] | -1.6045 | 0.137 | -11.719 | 0.000 | -1.873 | -1.336 |
| C(club_name)[T.Norwich City] | 0.6697 | 0.116 | 5.774 | 0.000 | 0.442 | 0.897 |
| C(club_name)[T.Odense Boldklub] | -1.4650 | 0.096 | -15.321 | 0.000 | -1.652 | -1.278 |
| C(club_name)[T.Ofi Kreta] | -1.5257 | 0.102 | -14.916 | 0.000 | -1.726 | -1.325 |
| C(club_name)[T.Ogc Nizza] | 0.3256 | 0.094 | 3.477 | 0.001 | 0.142 | 0.509 |
| C(club_name)[T.Olimpik Donetsk] | -1.6505 | 0.098 | -16.762 | 0.000 | -1.844 | -1.458 |
| C(club_name)[T.Olympiakos Piraus] | -0.1670 | 0.090 | -1.857 | 0.063 | -0.343 | 0.009 |
| C(club_name)[T.Olympique Lyon] | 0.7511 | 0.093 | 8.089 | 0.000 | 0.569 | 0.933 |
| C(club_name)[T.Olympique Marseille] | 0.4940 | 0.093 | 5.316 | 0.000 | 0.312 | 0.676 |
| C(club_name)[T.Oud Heverlee Leuven] | -1.1822 | 0.120 | -9.890 | 0.000 | -1.416 | -0.948 |
| C(club_name)[T.Palermo Fc] | -0.5068 | 0.115 | -4.392 | 0.000 | -0.733 | -0.281 |
| C(club_name)[T.Panathinaikos Athen] | -0.8799 | 0.090 | -9.808 | 0.000 | -1.056 | -0.704 |
| C(club_name)[T.Panetolikos Gfs] | -1.6434 | 0.093 | -17.682 | 0.000 | -1.826 | -1.461 |
| C(club_name)[T.Panionios Athen] | -1.6348 | 0.098 | -16.738 | 0.000 | -1.826 | -1.443 |
| C(club_name)[T.Panthrakikos Komotini] | -1.7776 | 0.133 | -13.408 | 0.000 | -2.037 | -1.518 |
| C(club_name)[T.Paok Thessaloniki] | -0.4784 | 0.090 | -5.293 | 0.000 | -0.656 | -0.301 |
| C(club_name)[T.Parma Calcio 1913] | 0.0104 | 0.105 | 0.099 | 0.921 | -0.196 | 0.217 |
| C(club_name)[T.Partick Thistle Fc] | -1.9474 | 0.124 | -15.653 | 0.000 | -2.191 | -1.704 |
| C(club_name)[T.Pas Giannina] | -1.6550 | 0.097 | -16.994 | 0.000 | -1.846 | -1.464 |
| C(club_name)[T.Pas Lamia 1964] | -1.9186 | 0.099 | -19.310 | 0.000 | -2.113 | -1.724 |
| C(club_name)[T.Pec Zwolle] | -1.3544 | 0.094 | -14.461 | 0.000 | -1.538 | -1.171 |
| C(club_name)[T.Pfk Lviv] | -1.8306 | 0.116 | -15.721 | 0.000 | -2.059 | -1.602 |
| C(club_name)[T.Pfk Stal Kamyanske] | -1.5165 | 0.121 | -12.544 | 0.000 | -1.753 | -1.280 |
| C(club_name)[T.Pfk Tambov] | -1.2992 | 0.120 | -10.793 | 0.000 | -1.535 | -1.063 |
| C(club_name)[T.Portimonense Sc] | -1.3134 | 0.102 | -12.931 | 0.000 | -1.513 | -1.114 |
| C(club_name)[T.Psv Eindhoven] | 0.2216 | 0.093 | 2.383 | 0.017 | 0.039 | 0.404 |
| C(club_name)[T.Queens Park Rangers] | 0.2690 | 0.184 | 1.465 | 0.143 | -0.091 | 0.629 |
| C(club_name)[T.Randers Fc] | -1.6194 | 0.095 | -16.985 | 0.000 | -1.806 | -1.433 |
| C(club_name)[T.Rasenballsport Leipzig] | 1.0777 | 0.097 | 11.127 | 0.000 | 0.888 | 1.268 |
| C(club_name)[T.Rayo Vallecano] | -0.3702 | 0.112 | -3.309 | 0.001 | -0.589 | -0.151 |
| C(club_name)[T.Rc Lens] | -0.5199 | 0.130 | -3.990 | 0.000 | -0.775 | -0.265 |
| C(club_name)[T.Rc Strassburg Alsace] | -0.1741 | 0.105 | -1.660 | 0.097 | -0.380 | 0.031 |
| C(club_name)[T.Rcd Mallorca] | -0.2579 | 0.127 | -2.024 | 0.043 | -0.508 | -0.008 |
| C(club_name)[T.Real Betis Sevilla] | 0.3576 | 0.095 | 3.775 | 0.000 | 0.172 | 0.543 |
| C(club_name)[T.Real Madrid] | 1.7121 | 0.092 | 18.550 | 0.000 | 1.531 | 1.893 |
| C(club_name)[T.Real Saragossa] | -0.2095 | 0.393 | -0.533 | 0.594 | -0.979 | 0.560 |
| C(club_name)[T.Real Sociedad San Sebastian] | 0.6608 | 0.092 | 7.162 | 0.000 | 0.480 | 0.842 |
| C(club_name)[T.Real Valladolid] | -0.2059 | 0.111 | -1.847 | 0.065 | -0.424 | 0.013 |
| C(club_name)[T.Rfc Seraing] | -1.5617 | 0.165 | -9.482 | 0.000 | -1.885 | -1.239 |
| C(club_name)[T.Rio Ave Fc] | -1.1476 | 0.096 | -11.988 | 0.000 | -1.335 | -0.960 |
| C(club_name)[T.Rkc Waalwijk] | -1.8128 | 0.119 | -15.187 | 0.000 | -2.047 | -1.579 |
| C(club_name)[T.Roda Jc Kerkrade] | -1.6108 | 0.121 | -13.269 | 0.000 | -1.849 | -1.373 |
| C(club_name)[T.Ross County Fc] | -1.8365 | 0.101 | -18.135 | 0.000 | -2.035 | -1.638 |
| C(club_name)[T.Rotor Volgograd] | -0.9340 | 0.185 | -5.050 | 0.000 | -1.296 | -0.572 |
| C(club_name)[T.Royal Antwerpen Fc] | -0.6155 | 0.098 | -6.253 | 0.000 | -0.808 | -0.423 |
| C(club_name)[T.Royal Excel Mouscron] | -1.2725 | 0.092 | -13.857 | 0.000 | -1.452 | -1.092 |
| C(club_name)[T.Royale Union Saint Gilloise] | -0.7978 | 0.158 | -5.060 | 0.000 | -1.107 | -0.489 |
| C(club_name)[T.Rsc Anderlecht] | 0.1797 | 0.088 | 2.032 | 0.042 | 0.006 | 0.353 |
| C(club_name)[T.Rsc Charleroi] | -0.8910 | 0.092 | -9.708 | 0.000 | -1.071 | -0.711 |
| C(club_name)[T.Rubin Kazan] | -0.3634 | 0.096 | -3.780 | 0.000 | -0.552 | -0.175 |
| C(club_name)[T.Rukh Lviv] | -1.7946 | 0.143 | -12.543 | 0.000 | -2.075 | -1.514 |
| C(club_name)[T.Sampdoria Genua] | 0.2552 | 0.093 | 2.736 | 0.006 | 0.072 | 0.438 |
| C(club_name)[T.Sbv Excelsior Rotterdam] | -1.7286 | 0.107 | -16.140 | 0.000 | -1.939 | -1.519 |
| C(club_name)[T.Sc Bastia] | -1.0474 | 0.122 | -8.566 | 0.000 | -1.287 | -0.808 |
| C(club_name)[T.Sc Beira Mar] | -0.5644 | 0.867 | -0.651 | 0.515 | -2.263 | 1.134 |
| C(club_name)[T.Sc Braga] | -0.3008 | 0.091 | -3.292 | 0.001 | -0.480 | -0.122 |
| C(club_name)[T.Sc Cambuur Leeuwarden] | -1.7060 | 0.126 | -13.520 | 0.000 | -1.953 | -1.459 |
| C(club_name)[T.Sc Farense] | -1.6433 | 0.178 | -9.239 | 0.000 | -1.992 | -1.295 |
| C(club_name)[T.Sc Freiburg] | 0.0812 | 0.093 | 0.869 | 0.385 | -0.102 | 0.264 |
| C(club_name)[T.Sc Heerenveen] | -1.0520 | 0.096 | -10.950 | 0.000 | -1.240 | -0.864 |
| C(club_name)[T.Sc Olhanense] | -2.0657 | 0.869 | -2.376 | 0.018 | -3.770 | -0.362 |
| C(club_name)[T.Sc Paderborn 07] | -0.8894 | 0.145 | -6.153 | 0.000 | -1.173 | -0.606 |
| C(club_name)[T.Sco Angers] | -0.4886 | 0.095 | -5.156 | 0.000 | -0.674 | -0.303 |
| C(club_name)[T.Sd Eibar] | -0.3112 | 0.099 | -3.155 | 0.002 | -0.504 | -0.118 |
| C(club_name)[T.Sd Huesca] | -0.5648 | 0.133 | -4.251 | 0.000 | -0.825 | -0.304 |
| C(club_name)[T.Shakhtar Donetsk] | 0.4750 | 0.093 | 5.090 | 0.000 | 0.292 | 0.658 |
| C(club_name)[T.Sheffield United] | 0.6175 | 0.139 | 4.447 | 0.000 | 0.345 | 0.890 |
| C(club_name)[T.Silkeborg If] | -1.7684 | 0.101 | -17.557 | 0.000 | -1.966 | -1.571 |
| C(club_name)[T.Sivasspor] | -0.6847 | 0.098 | -7.000 | 0.000 | -0.876 | -0.493 |
| C(club_name)[T.Sk Dnipro 1] | -1.3298 | 0.121 | -11.011 | 0.000 | -1.567 | -1.093 |
| C(club_name)[T.Ska Khabarovsk] | -1.1639 | 0.135 | -8.629 | 0.000 | -1.428 | -0.900 |
| C(club_name)[T.Sm Caen] | -0.8035 | 0.111 | -7.266 | 0.000 | -1.020 | -0.587 |
| C(club_name)[T.Sonderjyske] | -1.7333 | 0.093 | -18.581 | 0.000 | -1.916 | -1.551 |
| C(club_name)[T.Spal] | -0.1296 | 0.109 | -1.192 | 0.233 | -0.343 | 0.083 |
| C(club_name)[T.Sparta Rotterdam] | -1.4724 | 0.104 | -14.211 | 0.000 | -1.675 | -1.269 |
| C(club_name)[T.Spartak Moskau] | 0.3206 | 0.097 | 3.321 | 0.001 | 0.131 | 0.510 |
| C(club_name)[T.Spezia Calcio] | -0.2382 | 0.127 | -1.869 | 0.062 | -0.488 | 0.012 |
| C(club_name)[T.Sporting Gijon] | -0.4414 | 0.136 | -3.238 | 0.001 | -0.709 | -0.174 |
| C(club_name)[T.Sporting Lissabon] | 0.3607 | 0.090 | 4.007 | 0.000 | 0.184 | 0.537 |
| C(club_name)[T.Spvgg Greuther Furth] | -0.5477 | 0.180 | -3.049 | 0.002 | -0.900 | -0.196 |
| C(club_name)[T.Ssc Neapel] | 1.3777 | 0.094 | 14.716 | 0.000 | 1.194 | 1.561 |
| C(club_name)[T.St Johnstone Fc] | -1.6299 | 0.100 | -16.242 | 0.000 | -1.827 | -1.433 |
| C(club_name)[T.St Mirren Fc] | -1.8081 | 0.113 | -15.936 | 0.000 | -2.031 | -1.586 |
| C(club_name)[T.Stade Brest 29] | -0.1590 | 0.124 | -1.285 | 0.199 | -0.402 | 0.084 |
| C(club_name)[T.Stade Reims] | -0.1852 | 0.099 | -1.872 | 0.061 | -0.379 | 0.009 |
| C(club_name)[T.Standard Luttich] | -0.3021 | 0.089 | -3.388 | 0.001 | -0.477 | -0.127 |
| C(club_name)[T.Stoke City] | 0.6387 | 0.111 | 5.731 | 0.000 | 0.420 | 0.857 |
| C(club_name)[T.Sv Darmstadt 98] | -0.8407 | 0.137 | -6.144 | 0.000 | -1.109 | -0.573 |
| C(club_name)[T.Sv Werder Bremen] | -0.0818 | 0.093 | -0.877 | 0.380 | -0.264 | 0.101 |
| C(club_name)[T.Sv Zulte Waregem] | -0.9520 | 0.092 | -10.339 | 0.000 | -1.133 | -0.772 |
| C(club_name)[T.Swansea City] | 0.4211 | 0.114 | 3.693 | 0.000 | 0.198 | 0.645 |
| C(club_name)[T.Thonon Evian Grand Geneve Fc] | -0.7198 | 0.190 | -3.789 | 0.000 | -1.092 | -0.347 |
| C(club_name)[T.Tom Tomsk] | -1.2778 | 0.165 | -7.731 | 0.000 | -1.602 | -0.954 |
| C(club_name)[T.Torpedo Moskau] | -0.9803 | 0.182 | -5.396 | 0.000 | -1.336 | -0.624 |
| C(club_name)[T.Tottenham Hotspur] | 1.6654 | 0.095 | 17.556 | 0.000 | 1.479 | 1.851 |
| C(club_name)[T.Trabzonspor] | -0.1610 | 0.093 | -1.731 | 0.083 | -0.343 | 0.021 |
| C(club_name)[T.Tsg 1899 Hoffenheim] | 0.4932 | 0.092 | 5.359 | 0.000 | 0.313 | 0.674 |
| C(club_name)[T.Ud Almeria] | -0.9025 | 0.194 | -4.644 | 0.000 | -1.283 | -0.522 |
| C(club_name)[T.Ud Las Palmas] | -0.5247 | 0.114 | -4.612 | 0.000 | -0.748 | -0.302 |
| C(club_name)[T.Ud Levante] | -0.1901 | 0.094 | -2.012 | 0.044 | -0.375 | -0.005 |
| C(club_name)[T.Udinese Calcio] | 0.1509 | 0.093 | 1.621 | 0.105 | -0.032 | 0.333 |
| C(club_name)[T.Ural Ekaterinburg] | -0.9479 | 0.095 | -9.988 | 0.000 | -1.134 | -0.762 |
| C(club_name)[T.Us Lecce] | -0.3001 | 0.148 | -2.024 | 0.043 | -0.591 | -0.009 |
| C(club_name)[T.Us Salernitana 1919] | -0.3448 | 0.162 | -2.130 | 0.033 | -0.662 | -0.027 |
| C(club_name)[T.Us Sassuolo] | 0.2343 | 0.092 | 2.535 | 0.011 | 0.053 | 0.415 |
| C(club_name)[T.Vejle Boldklub] | -1.6135 | 0.116 | -13.955 | 0.000 | -1.840 | -1.387 |
| C(club_name)[T.Vendsyssel Ff] | -1.6703 | 0.140 | -11.954 | 0.000 | -1.944 | -1.396 |
| C(club_name)[T.Venezia Fc] | -0.2462 | 0.164 | -1.503 | 0.133 | -0.567 | 0.075 |
| C(club_name)[T.Veria Nps] | -1.7191 | 0.119 | -14.467 | 0.000 | -1.952 | -1.486 |
| C(club_name)[T.Vfb Stuttgart] | 0.2783 | 0.097 | 2.869 | 0.004 | 0.088 | 0.468 |
| C(club_name)[T.Vfl Bochum] | -0.6585 | 0.175 | -3.773 | 0.000 | -1.001 | -0.316 |
| C(club_name)[T.Vfl Wolfsburg] | 0.6695 | 0.093 | 7.229 | 0.000 | 0.488 | 0.851 |
| C(club_name)[T.Viborg Ff] | -1.7413 | 0.112 | -15.564 | 0.000 | -1.961 | -1.522 |
| C(club_name)[T.Vitesse Arnheim] | -0.8694 | 0.094 | -9.211 | 0.000 | -1.054 | -0.684 |
| C(club_name)[T.Vitoria Guimaraes Sc] | -0.8063 | 0.091 | -8.833 | 0.000 | -0.985 | -0.627 |
| C(club_name)[T.Vitoria Setubal Fc] | -1.4818 | 0.099 | -15.031 | 0.000 | -1.675 | -1.289 |
| C(club_name)[T.Volga Nizhniy Novgorod] | -1.3643 | 0.616 | -2.213 | 0.027 | -2.572 | -0.156 |
| C(club_name)[T.Volos Nps] | -1.8127 | 0.125 | -14.558 | 0.000 | -2.057 | -1.569 |
| C(club_name)[T.Volyn Lutsk] | -1.5372 | 0.128 | -12.006 | 0.000 | -1.788 | -1.286 |
| C(club_name)[T.Vorskla Poltava] | -1.2126 | 0.098 | -12.419 | 0.000 | -1.404 | -1.021 |
| C(club_name)[T.Vv St Truiden] | -1.0644 | 0.092 | -11.517 | 0.000 | -1.246 | -0.883 |
| C(club_name)[T.Vvv Venlo] | -1.6193 | 0.110 | -14.758 | 0.000 | -1.834 | -1.404 |
| C(club_name)[T.Waasland Beveren] | -1.1560 | 0.093 | -12.395 | 0.000 | -1.339 | -0.973 |
| C(club_name)[T.West Bromwich Albion] | 0.5462 | 0.107 | 5.084 | 0.000 | 0.336 | 0.757 |
| C(club_name)[T.West Ham United] | 1.0151 | 0.095 | 10.666 | 0.000 | 0.829 | 1.202 |
| C(club_name)[T.Wigan Athletic] | -0.9429 | 0.369 | -2.555 | 0.011 | -1.666 | -0.220 |
| C(club_name)[T.Willem Ii Tilburg] | -1.3043 | 0.095 | -13.687 | 0.000 | -1.491 | -1.117 |
| C(club_name)[T.Wolverhampton Wanderers] | 1.0961 | 0.110 | 9.943 | 0.000 | 0.880 | 1.312 |
| C(club_name)[T.Yeni Malatyaspor] | -1.0861 | 0.104 | -10.456 | 0.000 | -1.290 | -0.882 |
| C(club_name)[T.Zenit St Petersburg] | 0.6765 | 0.096 | 7.073 | 0.000 | 0.489 | 0.864 |
| C(club_name)[T.Zirka Kropyvnytskyi] | -1.7529 | 0.130 | -13.518 | 0.000 | -2.007 | -1.499 |
| C(club_name)[T.Zorya Lugansk] | -1.1740 | 0.097 | -12.151 | 0.000 | -1.363 | -0.985 |
| C(club_name)[T.Zska Moskau] | 0.3364 | 0.095 | 3.557 | 0.000 | 0.151 | 0.522 |
| age | 0.0192 | 0.001 | 19.836 | 0.000 | 0.017 | 0.021 |
| goals | 0.0082 | 0.001 | 10.623 | 0.000 | 0.007 | 0.010 |
| assists | 0.0148 | 0.001 | 12.738 | 0.000 | 0.012 | 0.017 |
| minutes_played | 0.0002 | 3e-06 | 68.717 | 0.000 | 0.000 | 0.000 |
| yellow_cards | 0.0001 | 0.001 | 0.152 | 0.879 | -0.002 | 0.002 |
| red_cards | 0.0191 | 0.007 | 2.640 | 0.008 | 0.005 | 0.033 |
| height | 0.0008 | 0.001 | 1.019 | 0.308 | -0.001 | 0.002 |
| Omnibus: | 2544.681 | Durbin-Watson: | 1.353 |
|---|---|---|---|
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 3861.538 |
| Skew: | -0.450 | Prob(JB): | 0.00 |
| Kurtosis: | 4.016 | Cond. No. | 2.83e+19 |
df_pred = data['all_eda'].assign(market_value_pred = np.exp(pred), log_market_value_pred = pred)
df_pred
| name | nationality | position | sub_position | height | season | market_value | goals | assists | minutes_played | yellow_cards | red_cards | club_name | age | log_market_value | market_value_pred | log_market_value_pred | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| player_id | |||||||||||||||||
| 9800 | Artem Milevskyi | Ukraine | Attack | Centre-Forward | 189 | 2020 | 90000.0 | 0 | 0 | 720 | 6 | 0 | Fk Minaj | 34.0 | 11.407565 | 1.713257e+05 | 12.051322 |
| 43084 | Gaetano Berardi | Switzerland | Defender | Right-Back | 179 | 2020 | 360000.0 | 0 | 0 | 228 | 0 | 0 | Leeds United | 31.0 | 12.793859 | 2.560309e+06 | 14.755639 |
| 230826 | Gennaro Acampora | Italy | Midfield | Central Midfield | 174 | 2020 | 360000.0 | 2 | 4 | 1248 | 4 | 0 | Spezia Calcio | 25.0 | 12.793859 | 8.594771e+05 | 13.664079 |
| 198087 | Matteo Ricci | Italy | Midfield | Defensive Midfield | 176 | 2020 | 1530000.0 | 0 | 6 | 4880 | 10 | 0 | Spezia Calcio | 25.0 | 14.240778 | 1.781009e+06 | 14.392690 |
| 110689 | Deniz Mehmet | Turkey | Goalkeeper | Goalkeeper | 192 | 2020 | 68000.0 | 0 | 0 | 1080 | 0 | 0 | Dundee United Fc | 27.0 | 11.127263 | 9.385872e+04 | 11.449546 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2019 | 420000.0 | 0 | 0 | 360 | 0 | 0 | Psv Eindhoven | 19.0 | 12.948010 | 9.894935e+05 | 13.804948 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2020 | 1102500.0 | 0 | 2 | 7494 | 10 | 0 | Psv Eindhoven | 20.0 | 13.913091 | 4.533150e+06 | 15.326928 |
| 364245 | Jordan Teze | Netherlands | Defender | Centre-Back | 183 | 2021 | 5400000.0 | 2 | 8 | 5260 | 12 | 0 | Psv Eindhoven | 21.0 | 15.501910 | 3.237632e+06 | 14.990353 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2020 | 658250.0 | 0 | 2 | 234 | 2 | 0 | Psv Eindhoven | 19.0 | 13.397340 | 1.353124e+06 | 14.117927 |
| 575367 | Richard Ledezma | United States | Attack | Attacking Midfield | 174 | 2021 | 765000.0 | 2 | 0 | 88 | 0 | 0 | Psv Eindhoven | 20.0 | 13.547631 | 1.320532e+06 | 14.093545 |
50365 rows × 17 columns
print('RMSE', smt.eval_measures.rmse(
df_pred['log_market_value'],
df_pred['log_market_value_pred']
))
RMSE 0.8584421552905203
def diagnostic_plot(X, y):
rgr = LinearRegression()
rgr.fit(X, y)
pred = rgr.predict(X)
plt.subplot(1, 3, 1)
plt.scatter(pred, y, alpha=0.1)
plt.plot(y, y, color = 'red', linewidth = 1)
plt.title('Regression fit')
plt.xlabel('Predicted y')
plt.ylabel('y')
sns.set(style = 'darkgrid')
diagnostic_plot(
X = data['all_eda'][[
'goals',
'assists',
'minutes_played',
'yellow_cards',
'red_cards',
'height',
'age'
# 'nationality',
# 'position',
# 'sub_position',
# 'club_name'
]],
y = data['all_eda']['log_market_value']
)
model_ols = smf.ols(formula = '''
log_market_value ~
C(nationality) + C(position) + C(sub_position) + C(club_name)
''', data = data['all_eda'])
fit = model_ols.fit()
pred = fit.predict()
print('RMSE', smt.eval_measures.rmse(
data['all_eda']['log_market_value'],
pred
))
RMSE 0.9917601841201406
Since our features include both numerical and categorical data we will transform the data and use a pipline to run a linear regression models. Our numeric data is transformed by sklearn's standard scaler and our categorical data will be one hot encoded using sklearn's OneHotEncoder. Our model includes a regularizer. More specifically, it uses l1 regularization. The metric of evaluation here is the score method for sklearn models.
# feature selection
X = data['all_eda'][[
'goals',
'assists',
'minutes_played',
'yellow_cards',
'red_cards',
'height',
'age',
'season',
'nationality',
'position',
'sub_position',
'club_name'
]]
y = data['all_eda']['log_market_value']
# train-test split
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size = 0.2, random_state = 0)
preprocessor = ColumnTransformer(
transformers = [
("num", StandardScaler(), [
'goals',
'assists',
'minutes_played',
'yellow_cards',
'red_cards',
'height',
'age'
]),
("cat", OneHotEncoder(handle_unknown = 'ignore'), [
'nationality',
'position',
'sub_position',
'club_name'
])
]
)
model_lasso = Pipeline(
steps = [
('preprocessor', preprocessor),
('dtr', skl.linear_model.Lasso())
]
)
model_lasso.fit(X_train, y_train)
model_lasso_y_pred = model_lasso.predict(X_test)
print('accuracy', model_lasso.score(X_test, y_test))
print('MSE', mean_squared_error(y_test, model_lasso_y_pred))
accuracy -2.901700328017398e-05 MSE 2.254265463732437
model_dtr = Pipeline(
steps = [
('preprocessor', preprocessor),
('dtr', skl.tree.DecisionTreeRegressor())
]
)
model_dtr.fit(X_train, y_train)
model_dtr_y_pred = model_dtr.predict(X_test)
print('accuracy', model_dtr.score(X_test, y_test))
print('MSE', mean_squared_error(y_test, model_dtr_y_pred))
accuracy 0.2822816498513936 MSE 1.6178807433761904
model_cv_dtr = skl.model_selection.GridSearchCV(
model_dtr,
param_grid = {
'dtr__splitter': ['best', 'random'],
#'dtr__max_depth': [1, 3, 5, 7, 9, 11, 12],
'dtr__max_depth': [1, 5, 9, 12],
#'dtr__min_samples_leaf': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'dtr__min_weight_fraction_leaf': [0.1, 0.2, 0.3, 0.4, 0.5],
'dtr__max_features': ['auto', 'log2', 'sqrt', None],
#'dtr__max_leaf_nodes': [None, 10, 20, 30, 40, 50, 60, 70, 80, 90]
},
scoring = 'neg_mean_squared_error',
cv = 5,
#verbose = 3,
n_jobs = -1
)
model_cv_dtr.fit(X_train, y_train).score(X_test, y_test)
-1.6765851975675852
model_cv_dtr.best_params_
{'dtr__max_depth': 5,
'dtr__max_features': 'auto',
'dtr__min_weight_fraction_leaf': 0.1,
'dtr__splitter': 'best'}
model_rfr = Pipeline(
steps=[('preprocessor', preprocessor),
('rfr', skl.ensemble.RandomForestRegressor(max_depth = 5))]
)
model_rfr.fit(X_train, y_train).score(X_test, y_test)
0.33956166004816013
model_cv_rfr = skl.model_selection.GridSearchCV(
model_rfr,
param_grid = {
'rfr__n_estimators': [10, 50, 100],
'rfr__max_depth': [1, 5, 9, 12],
'rfr__min_weight_fraction_leaf': [0.1, 0.3, 0.5],
'rfr__max_features': ['auto', 'log2', 'sqrt', None]
},
scoring = 'neg_mean_squared_error',
cv = 5,
#verbose = 3,
n_jobs = -1
)
model_cv_rfr.fit(X_train, y_train).score(X_test, y_test)
-1.6521475613018508
model_cv_rfr.best_params_
{'rfr__max_depth': 12,
'rfr__max_features': 'auto',
'rfr__min_weight_fraction_leaf': 0.1,
'rfr__n_estimators': 100}
plot_learning_curve(
model_cv_rfr,
title = 'Learning Curve (Random Forest)',
X = X, y = y,
n_jobs = -1
)
In part 1, we wanted to start with showing the correlation between the variables we have. From our heatmap we can see which variables are the most important and that the most red are the most important variables which are goals, assists, minutes played, red card, and yellow card. The variables in the red staircase are the most red which means they are the most important. Our pair plot shows the relationship between all the variables and what the correlation is between them. For example we can see how red cards and minutes played are strongly correlated.
For part 2, we did our first OLS without categorical data. We wanted to compare the results from OLS done with categorical values and numerical values to see which would give better results. From our first OLS we got some negative values from the T test. We were able to see the correlation between the variables, for example, we see that the red cards variable gave the least correlation. Following that we took the log of the market value. This gave us different T variables and we got different results for the red card and yellow card variables. Our Means of Error also goes down.
We can interpret the first two results as a test ground for non-categorical data. In parts 3 and 4, we wanted to include all the possible data to determine which categories are the most important using the statsmodel OLS design.
After taking the log magnitude of our predicted value, every categorical value was one-hot encoded in the background to add weights in our model. Taking the log reduced the amount of deviation error from each of our variables. When the new data was added, our model showed a new emphasis to our age and height and less to goals and assists. Lastly, including the categorical variables made the red cards and yellow cards number less statistically significant as their p-value too high.
The regression plot showed a way to visualize the data and get an explanation of how much its centralized. Taking log helped removing the differences created because of how much our data was centered closer to 10 million pounds. The visualization of the regression plot was using a new metric of Linear regression instead of OLS. The linear regression produced a single line going through the best fit our predicted and true values. Next, we wanted to incorporate the categorical data as well. The data was split into a test and training set for both labels and samples. To simplify our problem, we used the model score to predict the metric, as our model was resulting in negative values in the market value.
Last but not least, we made another model implementing our categorical data similar to subsection 4. This time, we produced a pipeline of the linear regression which used one-hot encoding, standardized the data using the StandardScalar() module, and lastly, included a regularization lasso term. These new changes prompted our score to be lower than before. The new term reduced to almost half of an error.
The OLS Model has a higher score for our predictions, using the pipeline method lead us to be correct almost half of the time.
One of the first limitations we ran into was that we wanted our models to be based on or inbetween specific dates but the dataset only evaluated players at the end of the season. That is why we limited our models to the results at the end of the season. Another problem that came as a result of our data was due to outliers in regards to market values. This gave us a classic fat tail distribution, and though we tried our best to standardize and regularize our data and model, there could have been more we could've done to combat this. Due to the nature of our data, we were limited on the kind of model to use. Since we were not trying to classify the players, but to recognize the best features, our main focus was using regression. We also ran into some limitations regarding the categorical features that would help us predict market value. Because linear regression can only use numerical data, we had to find a way around this. Therefore, we one hot encoded the categorical features. While this provided a quick solution, there were some values of categories that held more weight in predicting market value. We could definitely have improved on transforming are categorical variables more effeciently since there was alot while also making it so they could be included in our linear models. Because of the vast amount of categorical data, our models ability to learn effectively was deminished. Moreover, we only had enough time to compute the best features that impact a player's worth on the market. With more time, we could have used algorithms to classify the players into certain price ranges by features such as with Neural Networks or Logistic regression. One particular classification problem we would tackle given more time would be categorizing players into those who have a higher market value then 100 million euros or those who have less (this could help clubs find players within a certain budget for example).
Since our data is readily available to the public and conforms to the privacy policy of the sourcing website Transfermarkt, we believe our research will not be subject to immediate concerns with neither ethics nor data privacy. Variables include name/pretty_name (name), country_of_birth/country_of_citizenship (nationality), date_of_birth (age) might be potentially relevant but are in no way detrimental to the ethics of our research. However, we do believe that the result of our research, once obtained and made public, could have unintended consequences. We evaluate a player's performance solely based on historical data; this implies that there will be biases. It is reasonable to expect that those biases, if not addressed and handled properly, could cause permanent damage to a person’s career. For instance, if a reliable player’s record shows that the player is unreliable, then team recruiters would use that information to make an informed decision based on false information. To prevent the chance of this being a consequence, we will put a disclaimer regarding the features that were not used in the evaluation of a player’s value. If a problem such as this comes up, we will remove said player's data from the study and make an effort to find and use the accurate data for each player.
The market value of players is a huge part of the football industry. Football clubs across the globe participate in the buying and selling of players and a players market value serves as their price tag. In order to conduct smarter business decisions in terms of buying and selling at the right price, it is crucial to understand a certain players value in the market. This market value is based on a number of factors ranging from performance statistics to even physical characteristics. Our analyses of tens of thousands of players indicate that the most important factors that play a role in determining market value are goals, assists, and minutes played. While yellow cards and red cards play the least role. Our models that included categorical features in training also indicate an emphasis on age, and the great impact it may have on market value. There is no doubt that the football industry involves huge amounts of money, and teams today are run more like businesses. In order to maximize success both financially and on the entertainment side of football, it is important that teams understand how the football market works. Therefore, it is important that research be done in this field. While our data and analyses covered many grounds, it is important that there is improvement. More specifically in terms of predicting market prices based on categorical features. Machine Learning is a relatively new field and there will always be room for improvement. We hope to see future work done in this field, and which improves on our analyses.
1 Wikipedia contributors. (2022, April 24). Association football. Wikipedia. https://en.wikipedia.org/wiki/Association_football
2 Biswas, B. (2021, July 16). Transfermarkt Market Value explained - How is it determined? Transfermarkt. https://www.transfermarkt.co.in/transfermarkt-market-value-explained-how-is-it-determined-/view/news/385100
3 Peeters, T. (2018). Testing the Wisdom of Crowds in the field: Transfermarkt valuations and international soccer results. International Journal of Forecasting, 34(1), 17–29. https://doi.org/10.1016/j.ijforecast.2017.08.002
4 Ackermann, P., & Follert, F. (2018). Einige bewertungstheoretische Anmerkungen zur Marktwertanalyse der Plattform transfermarkt.de. doi:10.22028/D291-32113
5 Transfermarkt. (2000, May). Fußball-Transfers, Gerüchte, Marktwerte und News. https://www.transfermarkt.de/
6 Summerscales, R. (2022, February 7). Man Utd, Man City And PSG Have Each Spent Over $1Billion Net On Transfers In 10 Years. Futbol on FanNation. https://www.si.com/fannation/soccer/futbol/news/man-utd-city-and-psg-spend-over-1b-net-on-transfers-in-10-years
7 Football Data from Transfermarkt. (2022, April 22). [Dataset]. https://www.kaggle.com/datasets/davidcariboo/player-scores
8 Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., ... Duchesnay, E. (2011). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825–2830.